C# 如何在ASP.NET MVC中创建webhook?

C# 如何在ASP.NET MVC中创建webhook?,c#,asp.net-mvc,callback,http-post,webhooks,C#,Asp.net Mvc,Callback,Http Post,Webhooks,我正在尝试创建一个简单的webhook来接收Nexmo SMS服务的送货收据。他们网站上唯一的文档就是这个 在帐户设置期间,您将被要求为Nexmo提供一个收货回执的回调URL,我们将为您提交的每个SMS发送收货回执。这将确认您的邮件是否到达收件人的手机。请求参数通过GET(默认)发送到您的回调URL,Nexmo将期待200 OK响应,或者将继续重试,直到送达回执过期(最多72小时)。 我一直在寻找实现这一点的方法,到目前为止,我从网上找到的一个例子中找到了这个方法,尽管我不确定这是否正确。不管怎

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

在帐户设置期间,您将被要求为Nexmo提供一个收货回执的回调URL,我们将为您提交的每个SMS发送收货回执。这将确认您的邮件是否到达收件人的手机。请求参数通过GET(默认)发送到您的回调URL,Nexmo将期待200 OK响应,或者将继续重试,直到送达回执过期(最多72小时)。

我一直在寻找实现这一点的方法,到目前为止,我从网上找到的一个例子中找到了这个方法,尽管我不确定这是否正确。不管怎样,这是在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]时才会调用它。我应该尝试的下一步是什么?

首先必须删除[HttpPost]位,因为它清楚地表明“参数是通过GET发送的”

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

然后,您只需从querystring或使用模型绑定读取值。以下是一个示例:

    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 />");
    }
public string CallbackURL()
{
字符串vals=“”;
//获取所有发送的数据
foreach(Request.QueryString.AllKeys中的字符串键)
VAL+=key+”:“+Request.QueryString[key]+Environment.NewLine;
//将所有接收到的数据发送到电子邮件或使用其他日志机制
//确保在web.config中正确设置了主机
SmtpClient smptClient=新的SmtpClient();
MailMessage MailMessage=新建MailMessage();
mailMessage.To.Add(“…@…com”);
mailMessage.From=新邮件地址(“..@….com”);
mailMessage.Subject=“收到回调”;
mailMessage.Body=“接收到的数据:”+Environment.NewLine+vals;
mailMessage.IsBodyHtml=false;
smptClient.Send(mailMessage);
//TODO:处理数据(是否保存到数据库?)
//不播放数据(仅用于除胶目的-待删除)
返回vals.Replace(Environment.NewLine,“
”); }
所以我遇到的问题根本不是我的webhook,而是IIS Express。显然,它阻止了来自外国主机的大部分流量,因此在将任何内容隧道传输到服务器之前,您可以进行一些调整。如果您遵循这些指南,您应该有一个工作的服务器


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


请参见Asp.Net团队在几周前宣布使用Visual Studio支持Web挂钩

请查看此处以了解更多详细信息:


目前的问题实际上是能够从web接收请求。所以,假设我在本地机器上运行我的服务器,并且我想调用CallbackURL函数,那么我可以将我的web浏览器直接指向localhost:6563/Home/CallbackURL。但正如我所说的,我需要公开访问它,所以我使用ngrok作为请求之间的中介。这就是我现在遇到的问题,所以ngrok应该转发到服务器运行的端口6563。但是,当我能收到400个错误请求时,我想为ebay soap通知创建订阅者和接收者。我想使用webhook。我可以在同一个应用程序中同时使用这两个吗