如何在 IIS 托管网站中接收自定义 Webhook?

2024-04-02

这是我所做的:

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

  <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 进行测试,将 webhook 测试发送到https://mywebbhooksite.com:5050/?z=SECRET,和它succeeds- 但是,当我检查那个小测试文件是否已创建时,它不存在。我还在主页上运行了一些 JavaScript 来轮询是否有任何更改dataReceived但我看到什么也没有发生。

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

为了捕获 Webhook 是否还需要执行任何其他特定设置?


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

我抛弃了GenericJsonWebHookHandler相反,我利用了Application_BeginRequest()事件在WebApiApplication而是拦截发送者 Webhook 发布的数据。钩子的主体位于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启动并将帖子内容放入JObject变量称为json

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

为了安全起见,我计划采取哪些措施来改进这一点

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 IIS 托管网站中接收自定义 Webhook? 的相关文章

随机推荐