如何在ASP.NET MVC中创建Webhook?

6

我正在尝试创建一个简单的Webhook来接收Nexmo短信服务的交付收据。他们网站上唯一的文档是这个:

在帐户设置期间,您将被要求提供给Nexmo一个用于交付收据的回调URL,我们将向其发送每个SMS提交的交付收据。这将确认您的消息是否已到达收件人的手机。请求参数通过GET(默认)发送到您的回调URL,并且Nexmo将期望响应200 OK响应,否则它将不断重试直到交付收据过期(最长达72小时)。

我一直在寻找方法来实现这一点,到目前为止,我从在线示例中找到了这种方法,但我不确定是否正确。无论如何,这是在ASP.NET上运行的,端口号为6563,所以我应该监听的是这个端口吗?我下载了一个叫做ngrok的应用程序,它可以将我的本地Web服务器暴露到互联网上,所以我运行了该应用程序并指示它监听端口6563,但没有成功。我一直在摆弄它,试图找到一些方法来向这个函数发送POST请求。

[HttpPost]
public ActionResult CallbackURL()
{
    System.IO.StreamReader reader = new System.IO.StreamReader(HttpContext.Request.InputStream);
    string rawSendGridJSON = reader.ReadToEnd();
    return new HttpStatusCodeResult(200);
}

通常情况下,我可以直接调用函数来返回视图,只需访问http://localhost:6563/Home/Index/CallbackURL。 所以我在方法签名上插入了一个断点,但只有当我将[HttpPost]从中移除时才会被调用。我应该尝试哪些下一步?
4个回答

3

首先,您需要删除[HttpPost]部分,因为它明确说明“参数通过GET方式发送”。

然后,您还应该删除return HttpStatusCodeResult(200),因为如果没有错误发生,它将返回200 OK状态码。

然后,您只需从查询字符串中读取值或使用模型绑定。以下是一个示例:

    public string CallbackURL()
    {
        string vals = "";

        // get all the sent data 
        foreach (String key in Request.QueryString.AllKeys)
            vals += key + ": " + Request.QueryString[key] + Environment.NewLine;

        // send all received data to email or use other logging mechanism
        // make sure you have the host correctly setup in web.config
        SmtpClient smptClient = new SmtpClient();
        MailMessage mailMessage = new MailMessage();
        mailMessage.To.Add("...@...com");
        mailMessage.From = new MailAddress("..@....com");
        mailMessage.Subject = "callback received";
        mailMessage.Body = "Received data: " + Environment.NewLine + vals;
        mailMessage.IsBodyHtml = false;
        smptClient.Send(mailMessage);

        // TODO: process data (save to database?)

        // disaplay the data (for degugging purposes only - to be removed)
        return vals.Replace(Environment.NewLine, "<br />");
    }

目前的问题实际上是能否从网络接收请求。所以,假设我在本地机器上运行我的服务器,并且我想调用我的CallbackURL函数,那么我只需将我的Web浏览器指向localhost:6563/Home/CallbackURL即可。但正如我所说,我需要它可以公开访问,因此我正在使用ngrok作为请求之间的中介。这就是我现在遇到的问题,所以ngrok应该转发到端口6563,这是服务器正在运行的地方。然而,当我调用http://domain.ngrok.com/Home/CallbackURL时,我得到了400错误请求。 - Dillon Drobena
我想为 eBay SOAP 通知创建一个订阅者和接收者。我想使用 Webhook。我可以在同一应用程序中同时拥有它们吗? - coder771

2

1
微软正在开发ASP.NET WebHooks,这是ASP.NET系列的新成员。它支持一种轻量级HTTP模式,提供了一个简单的发布/订阅模型,用于将Web API和SaaS服务连接在一起。
请参见Introducing Microsoft ASP.NET WebHooks Preview

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接