ASP.NET WebHook 概述
WebHook 是一种轻型 HTTP 模式,提供一个简单的发布/订阅模型,用于将 Web API 和 SaaS 服务连接在一起。 当服务中发生事件时,会以 HTTP POST 请求的形式向已注册的订阅者发送通知。 POST 请求包含有关事件的信息,使接收方能够执行相应的操作。
由于 WebHook 的简单性,已由大量服务公开,包括 Dropbox、 GitHub、 Bitbucket、 MailChimp、 PayPal、 Slack、 Stripe、 Trello 等。 例如,WebHook 可以指示 Dropbox 中的文件已更改、GitHub 中已提交代码更改、PayPal 中发起付款或在 Trello 中创建卡。 可能性是无穷无尽的!
借助 Microsoft ASP.NET WebHook,可以更轻松地将 WebHook 作为 ASP.NET 应用程序的一部分发送和接收 WebHook:
在接收端,它提供了一个通用模型,用于从任意数量的 WebHook 提供程序接收和处理 WebHook。 它现成支持 Dropbox、 GitHub、 Bitbucket、 MailChimp、 PayPal、 Pusher、 Salesforce、 Slack、 Stripe、 Trello、WordPress 和 Zendesk ,但可以轻松添加对更多支持。
在发送端,它支持管理和存储订阅,以及向正确的订阅者集发送事件通知。 这允许你定义自己的一组事件,订阅者可以订阅这些事件,并在事件发生时通知他们。
这两个部分可以一起使用,也可以根据方案分开使用。 如果只需要从其他服务接收 WebHook,则可以仅使用接收方部件;如果只想公开 WebHook 供其他人使用,则可以执行此操作。
该代码面向 ASP.NET Web API 2 和 ASP.NET MVC 5,在 GitHub 上作为 OSS 提供。
WebHook 是一种模式,这意味着它因服务而异,但基本思路是相同的。 可以将 WebHook 视为一个简单的发布/订阅模型,用户可以在其中订阅其他地方发生的事件。 事件通知作为 HTTP POST 请求传播,其中包含有关事件本身的信息。
通常,HTTP POST 请求包含由 WebHook 发送方确定的 JSON 对象或 HTML 表单数据,包括有关导致 WebHook 触发的事件的信息。 例如,由于在特定存储库中打开了新问题, GitHub 中的 WebHook POST 请求正文如下所示:
{
"action": "opened",
"issue": {
"url": "https://api.github.com/repos/octocat/Hello-World/issues/1347",
"number": 1347,
...
},
"repository": {
"id": 1296269,
"full_name": "octocat/Hello-World",
"owner": {
"login": "octocat",
"id": 1
...
},
...
},
"sender": {
"login": "octocat",
"id": 1,
...
}
}
为了确保 WebHook 确实来自目标发送方,POST 请求以某种方式受到保护,然后由接收方验证。 例如, GitHub WebHooks 包含一个 X-Hub-Signature HTTP 标头,其中包含由接收方实现检查的请求正文哈希,因此无需担心。
WebHook 流通常如下所示:
WebHook 发送方公开客户端可以订阅的事件。 这些事件描述对系统的可观测更改,例如,已插入新数据项、进程已完成或其他内容。
WebHook 接收方通过注册由四项内容组成的 WebHook 进行订阅:
应以 HTTP POST 请求的形式发布事件通知的 URI;
描述应为其触发 WebHook 的特定事件的一组筛选器;
用于对 HTTP POST 请求进行签名的密钥;
要包含在 HTTP POST 请求中的其他数据。 例如,它可以是 HTTP POST 请求正文中包含的其他 HTTP 标头字段或属性。
事件发生后,将找到匹配的 WebHook 注册并提交 HTTP POST 请求。 通常,如果由于某种原因收件人未响应或 HTTP POST 请求导致错误响应,则会多次重试 HTTP POST 请求的生成。
用于传入 WebHook 的 Microsoft ASP.NET WebHook 处理管道如下所示:
此处的两个关键概念是 接收器 和 处理程序:
接收方 负责处理来自给定发送方的特定 WebHook 风格,并强制实施安全检查,以确保 WebHook 请求确实来自预期发送方。
处理程序 通常是用户代码运行处理特定 WebHook 的位置。
在以下节点中,更详细地介绍了这些概念。