c# - 如何在 IIS 托管网站中接收自定义 webhook?

标签 c# iis webhooks

这是我所做的:

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

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

    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 中设置了一个 key :

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    ...
    <add key="MS_WebHookReceiverSecret_GenericJson" value="z=SECRET"/> 
  </appSettings>

4 - 我写了一个基本的接收器(使用 genericjson 钩子(Hook)捕获)

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 将 webhook 测试发送到 https://mywebbhooksite.com:5050/?z=SECRET 进行测试,它成功 - 但是,当我检查是否已创建该小测试文件时,它不存在。我还在主页上运行了一些 javascript 以轮询对 dataReceived 的任何更改,但我没有看到任何事情发生。

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

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

最佳答案

我采取了一种有效的肮脏方法

我放弃了 GenericJsonWebHookHandler,而是利用 WebApiApplication 中的 Application_BeginRequest() 事件来拦截发送方 Webhook 发布的数据。钩子(Hook)的主体位于 HttpRequest.Request.Inputstream 中,可以使用流阅读器打开它。可以将内容读取到 string 并解析为 JObject(如果 webhook Request 发送的请求主体是 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 启动并将帖子的内容放入名为 json

JObject 变量中

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

为了安全,我打算做什么来改进这一点

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

关于c# - 如何在 IIS 托管网站中接收自定义 webhook?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272684/

相关文章:

c# - CheckedListBox 中没有 ItemChecked 事件?

c# - 如何在新流程中启动第二个项目的新实例

c# - 收到有关 IIS 重置的通知吗?

c# - IIS 8.0 HTTP 错误 404.17 - 未找到请求的内容似乎是脚本,不会由静态文件处理程序提供服务

amazon-web-services - 与 Amazon EC2 的 Webhook

c# - 有没有办法在正则表达式中执行动态替换?

c# - 在使用SandcaSTLe的构建过程中自动生成html文档

PHP mkdir 权限由于只读属性而被拒绝在 Windows Server 2008 IIS 7 上运行?

file - 将 gitlab 提交消息保存到文件

botframework - 如何在 Telegram BotFather 中设置创建的游戏的 Url?