ASP.NET WebHooks 概觀
Webhooks 是一種輕量型 HTTP 模式,提供簡單的發佈/訂閱模型將 Web API 和 SaaS 服務編寫在一起。 當服務中發生事件時,通知會以 HTTP POST 要求的形式傳送給已註冊的訂閱者。 POST 要求包含事件的相關資訊,讓接收者能夠據以採取行動。
由於其簡單性,WebHook 已經由大量服務公開,包括 Dropbox、GitHub、Bitbucket、MailChimp、PayPal、Slack、Stripe、Trello 等等。 例如,WebHook 可以指出 Dropbox 中的檔案已變更,或 GitHub 中已認可程式碼變更,或在 PayPal 中已起始付款,或在 Trello 中已建立卡片。 有無限多的可能性!
Microsoft ASP.NET WebHooks 可讓您更輕鬆地在 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 是一種模式,表示它會因不同服務的使用方式而異,但基本概念相同。 您可以將 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 處理管線
對於傳入的 WebHook,Microsoft ASP.NET WebHook 處理管線看起來像這樣:
這裡的兩個主要概念是接收者和處理常式:
接收者負責處理來自指定傳送者的特定 WebHook 類別,並強制執行安全性檢查,以確保 WebHook 要求確實來自預定的傳送者。
處理常式通常是使用者程式碼執行處理特定 WebHook 的位置。
在下列節點中,詳細說明了這些概念。