如何在IIS托管网站中收到自定义webhook?

时间:2016-02-08 15:01:10

标签: c# iis webhooks

这就是我所做的:

1 - 我已经安装了nuget包:Microsoft.AspNet.WebHooks.Receivers.Custom 1.2.0-beta

2 - 我将WebApiConfig配置为接收自定义webhooks:

    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);
    }
}

现在,通过上述步骤可以预期,如果将webhook发件人设置为将Json发布到IIS托管站点,它应该将通知捕获为Json,将捕获的数据分配给dataReceived并编写空白文本文件为c:\test\test.txt - ,情况并非如此

目前,我正在使用Team Foundation Server对此进行测试,以便向https://mywebbhooksite.com:5050/?z=SECRET发送webhook测试,并且成功 - 但是,当我检查是否已创建该小测试文件时它不在那里。我还在主页上运行了一些javascript来轮询dataReceived的任何更改,但我看不到发生任何事情。

这里提到:我有一个连接到w3wp.exe进程的远程调试器,ExecuteAsync上的断点和GenericJsonWebHookHandler没有被点击

是否需要进行任何其他特定设置才能捕获webhook?

1 个答案:

答案 0 :(得分:2)

我采取了一种有效的方法

我放弃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
        }
    }

测试:

我进入了我的webhook并开始了webhook测试。它与json发布了请求。 HTTP 200是来自服务器的响应。

断点被击中。 HttpMethod收到了帖子。请求InputStream已被阅读并存储在documentContents中。 JObject.Parse已将该帖子的内容发布到名为JObject

json变量中

json的内容已写入存储在服务器上的文件中 - 表明请求已正确接收。

为了安全起见,我打算采取哪些措施来改善这一点

出于安全考虑,我将加密我在web.config中设置的密钥,并在web.config中设置加密密钥,然后将其与传入的URL查询参数匹配(使用相同的加密算法) )查看该密钥是否存在且完全相同