【问题标题】:How do I create a webhook in ASP.NET MVC?如何在 ASP.NET MVC 中创建 webhook?
【发布时间】:2014-10-17 03:10:05
【问题描述】:

我正在尝试创建一个简单的 webhook 来接收来自 Nexmo SMS 服务的送达收据。他们网站上的唯一文档就是这个。

During account set-up, you will be asked to supply Nexmo a CallBack URL for Delivery Receipt to which we will send a delivery receipt for each of your SMS submissions. This will confirm whether your message reached the recipient's handset. The request parameters are sent via a GET (default) to your Callback URL and Nexmo will be expecting response 200 OK response, or it will keep retrying until the Delivery Receipt expires (up to 72 hours).

我一直在寻找执行此操作的方法,到目前为止,我从网上找到的示例中获得了此方法,尽管我不确定这是否正确。无论如何,这是在 ASP.NET 和端口 6563 上运行的,所以这是我应该监听的端口吗?我下载了一个名为 ngrok 的应用程序,它应该将我的本地 Web 服务器公开到 Internet,所以我运行该应用程序并指示它侦听端口 6563,但没有运气。我一直在摆弄它,试图找到发布到这个函数的方法。

[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] 时才会调用它。我应该尝试哪些后续步骤?

【问题讨论】:

    标签: c# asp.net-mvc callback http-post webhooks


    【解决方案1】:

    首先您必须删除 [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 函数,那么我可以将我的网络浏览器定向到 localhost:6563/Home/CallbackURL。但正如我所说,我需要它可以公开访问,所以我使用 ngrok 作为请求之间的中介。这是我现在遇到问题的地方,所以 ngrok 应该转发到服务器运行的端口 6563。但是,当我可以使用 domain.ngrok.com/Home/CallbackURL 时,我会收到 400 错误请求。
    • 我想为 ebay 肥皂通知创建订阅者和接收者。我想使用 webhook。我可以在同一个应用程序中同时拥有两者吗
    【解决方案2】:

    在几周前,Asp.Net 团队宣布使用 Visual Studio 支持 Web Hooks。

    请在此处查看更多详细信息:

    https://neelbhatt40.wordpress.com/2015/10/14/webhooks-in-asp-net-a-visual-studio-extension/

    【讨论】:

      【解决方案3】:

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

      Introducing Microsoft ASP.NET WebHooks Preview

      【讨论】:

        【解决方案4】:

        所以我遇到的问题根本不是我的 webhook,它实际上是 IIS Express。显然,它会阻止来自外国主机的大部分流量,因此在将任何东西通过隧道传输到您的服务器之前,您可以进行一些调整。如果您遵循这些指南,您应该有一个工作服务器。

        https://gist.github.com/nsbingham/9548754

        https://www.twilio.com/blog/2014/03/configure-windows-for-local-webhook-testing-using-ngrok.html

        【讨论】:

          猜你喜欢
          • 2020-11-09
          • 2016-08-12
          • 2018-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          • 2023-04-11
          相关资源
          最近更新 更多