Как создать webhook в ASP.NET MVC?

Я пытаюсь создать простой веб-крючок для получения квитанции о доставке от службы 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, которое должен подвергнуть мой локальный веб-сервер интернету, поэтому я запустил приложение и поручил ему прослушивать порт 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]. Какие следующие шаги, которые я должен попробовать?

4 ответов


сначала вам нужно удалить бит [HttpPost], потому что в нем четко указано, что "параметры отправляются через GET".

тогда вы также должны удалить return 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 />");
    }

до пары недель Asp.Net команда объявила о поддержке веб-крючков с Visual Studio.

пожалуйста, посмотрите здесь для получения более подробной информации:

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


Microsoft работает над ASP.NET WebHooks, новое дополнение к ASP.NET семья. Он поддерживает легкий шаблон HTTP, обеспечивающий простую модель pub / sub для подключения веб-API и служб SaaS.

посмотреть представляем Microsoft ASP.NET просмотр WebHooks


таким образом, проблема у меня была не с моим 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