我正在尝试创建一个简单的网络钩子(Hook)来接收来自 Nexmo SMS 服务的送达回执。他们网站上唯一的文档就是这个。
在帐户设置过程中,您将被要求向 Nexmo 提供一个用于送达回执的回调 URL,我们将向其发送您提交的每条 SMS 的送达回执。这将确认您的消息是否到达了收件人的手机。请求参数通过 GET(默认)发送到您的回调 URL,Nexmo 将期待响应 200 OK 响应,或者它将继续重试,直到送达回执过期(最多 72 小时)。
我一直在寻找执行此操作的方法,到目前为止,我从网上找到的一个示例中得到了这个方法,尽管我不确定这是否正确。无论如何,这是在 ASP.NET 和端口 6563 上运行的,所以这是我应该监听的端口吗?我下载了一个名为 ngrok 的应用程序,它应该将我的本地 Web 服务器暴露给互联网,所以我运行了该应用程序并指示它监听端口 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
直接调用函数返回 View
所以我在方法签名上插入了一个断点,但只有当我从中删除 [HttpPost] 时它才会被调用。我应该尝试任何后续步骤吗?
最佳答案
首先,您必须删除 [HttpPost] 位,因为它明确指出“参数是通过 GET 发送的”。
然后您还应该删除返回的 HttpStatusCodeResult(200),因为如果没有发生错误,它无论如何都会返回 200 OK 状态代码。
那么您应该简单地从查询字符串或使用模型绑定(bind)中读取值。这是一个示例:
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 />");
}
关于c# - 如何在 ASP.NET MVC 中创建 Webhook?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26417285/