ASP.NET WebHooks 接收器

接收 WebHook 取决于发件人是谁。 有时,注册 WebHook 时需要执行其他步骤,以验证订阅者是否确实在侦听。 某些 WebHook 提供了一个推送到拉取模型,其中 HTTP POST 请求仅包含对事件信息的引用,随后将单独检索该信息。 通常,安全模型存在很大差异。

Microsoft ASP.NET WebHook 的目的是使连接 API 更简单、更一致,而无需花费大量时间弄清楚如何处理 WebHook 的任何特定变体。

WebHook 接收方负责接受和验证来自特定发送方的 WebHook。 WebHook 接收器可以支持任意数量的 WebHook,每个 WebHook 都有其自己的配置。 例如,GitHub WebHook 接收方可以接受任意数量的 GitHub 存储库中的 WebHook。

WebHook 接收器 URI

通过安装 Microsoft ASP.NET WebHook,可以获得一个常规 WebHook 控制器,该控制器接受来自开放式数量的服务的 WebHook 请求。 当请求到达时,它会选取已安装用于处理特定 WebHook 发送方的相应接收方。

此控制器的 URI 是向服务注册的 WebHook URI,格式如下:

https://<host>/api/webhooks/incoming/<receiver>/{id}

出于安全原因,许多 WebHook 接收器要求 URI 是 https URI,在某些情况下,它还必须包含额外的查询参数,该参数用于强制只有目标一方才能将 WebHook 发送到上述 URI。

组件 <receiver> 是接收方的名称,例如 githubslack

{id} 是一个可选标识符,可用于标识特定的 WebHook 接收方配置。 这可用于向特定接收方注册 N 个 WebHook。 例如,以下三个 URI 可用于注册三个独立的 WebHook:

https://<host>/api/webhooks/incoming/github
https://<host>/api/webhooks/incoming/github/12345
https://<host>/api/webhooks/incoming/github/54321

安装 WebHook 接收器

若要使用 Microsoft ASP.NET WebHook 接收 WebHook,请先安装要从中接收 WebHook 的 WebHook 提供程序的 Nuget 包。 Nuget 包名为 Microsoft.AspNet.WebHooks.Receivers.* ,其中最后一部分指示受支持的服务。 例如:

Microsoft.AspNet.WebHooks.Receivers.GitHub 支持从 GitHub 接收 WebHook,Microsoft.AspNet.WebHooks.Receivers.Custom 支持接收由 ASP.NET WebHook 生成的 WebHook。

现成支持 Dropbox、GitHub、MailChimp、PayPal、Pusher、Salesforce、Slack、Stripe、Trello 和 WordPress,但可以支持任意数量的其他提供商。

配置 WebHook 接收器

WebHook 接收器通过 IWebHookReceiverConfig 接口进行配置,可以使用任何依赖项注入模型注册该接口的特定实现。 默认实现使用可以在 Web.config 文件中设置的应用程序设置,或者,如果使用 Azure Web 应用,可以通过 Azure 门户进行设置。

Azure 应用设置

应用程序设置密钥的格式如下所示:

MS_WebHookReceiverSecret_<receiver>

该值是与 WebHook 已注册的 {id} 值匹配的值的逗号分隔列表,例如:

MS_WebHookReceiverSecret_GitHub = <secret1>, 12345=<secret2>, 54321=<secret3>

初始化 WebHook 接收器

WebHook 接收器通过注册它们进行初始化,通常位于 WebApiConfig 静态类中,例如:

namespace WebHookReceivers
{
    public static class 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 }
            );

            // Load receivers
            config.InitializeReceiveGitHubWebHooks();
        }
    }
}