Как получить специальный веб-крючок на веб-сайте IIS?
Вот что я сделал:
1 - Я установил пакет nuget: Microsoft.AspNet.WebHooks.Receivers.Custom 1.2.0-beta
2 - я настроил WebApiConfig
чтобы получить пользовательские веб-хуки:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.InitializeReceiveCustomWebHooks(); //<<<---
}
3 - Я установил секретный ключ в файле web.config:
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
...
<add key="MS_WebHookReceiverSecret_GenericJson" value="z=SECRET"/>
</appSettings>
4 - я написал базовый приемник (с перехватом genericjson)
public class GenericJsonWebHookHandler : WebHookHandler
{
public static string dataReceived;
public GenericJsonWebHookHandler()
{
this.Receiver = "genericjson";
}
public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
{
// Get JSON from WebHook
JObject data = context.GetDataOrDefault<JObject>();
if (context.Id == "i")
{
// do stuff
}
else if (context.Id == "z")
{
// do more stuff
dataReceived = data.ToString();
File.Create(@"c:\test\test1.txt");
}
return Task.FromResult(true);
}
}
Теперь можно ожидать, что с помощью описанных выше шагов, если отправитель веб-крюка настроен на публикацию Json на размещенный сайт IIS, он должен записать уведомление как Json, назначить захваченные данные dataReceived
и написать пустой текстовый файл c:\test\test.txt
- чего не было
В настоящее время я тестирую это с помощью Team Foundation Server, чтобы отправить тест веб-крюка https://mywebbhooksite.com:5050/?z=SECRET
, и это успешно - однако, когда я проверяю, был ли создан этот маленький тестовый файл, его там нет. У меня также есть некоторый javascript, работающий на домашней странице, чтобы опросить любые изменения в dataReceived
но я вижу, что ничего не происходит.
Упоминание здесь: у меня есть удаленный отладчик, подключенный к процессу w3wp.exe, точка останова на ExecuteAsync и GenericJsonWebHookHandler не получает удар
Существуют ли какие-либо другие конкретные настройки, которые необходимо выполнить, чтобы захватить веб-крючок?
1 ответ
Я выбрал грязный подход, который работает
Я угробил GenericJsonWebHookHandler
и вместо этого я использовал Application_BeginRequest()
событие в WebApiApplication
вместо этого перехватить данные, отправленные отправителем Webhook. Тело крючка находится в HttpRequest.Request.Inputstream
, который можно открыть с помощью потокового ридера. Содержимое можно прочитать на string
и анализируется в JObject (если тело запроса, отправленного запросом webhook, является JSon)
Вот мой код
protected void Application_BeginRequest()
{
if (!Request.HttpMethod.Equals("post", StringComparison.InvariantCultureIgnoreCase)) {
return;
}
string documentContents;
using (var receiveStream = Request.InputStream)
{
using (var readStream = new StreamReader(receiveStream, Encoding.UTF8))
{
documentContents = readStream.ReadToEnd();
}
}
try
{
var json = JObject.Parse(documentContents);
File.WriteAllLines(@"C:\test\keys.txt", new[] { documentContents, "\r\n", json.ToString() });
}
catch (Exception)
{
// do something
}
}
Тест:
Я пошел на свой веб-крючок и начал тест веб-крюка. Он опубликовал запрос с JSON. HTTP 200 был ответ от сервера.
Точка останова была достигнута. HttpMethod
взял пост. Запрос InputStream
был прочитан и сохранен в documentContents
, JObject.Parse
выстрелил и поместил содержимое поста в JObject
переменная называется json
Содержание json
был записан в файл, хранящийся на сервере, что указывает на то, что запрос был получен правильно.
Что я планирую сделать, чтобы улучшить это, для безопасности
В целях безопасности я зашифрую секретный ключ, который я установил в файле web.config, и вместо этого установлю зашифрованный ключ в файле web.config, а после этого сопоставлю его с параметрами входящего URL-запроса (используя тот же алгоритм шифрования), чтобы увидеть если этот ключ присутствует и точно такой же