ASP.NET webhook 總覽
Webhook 是輕量 HTTP 模式,提供簡單的 pub/sub 模型,可將 Web Api 和 SaaS 服務連接在一起。 當服務中發生事件時,會以 HTTP POST 要求的形式傳送通知給已註冊的訂閱者。 POST 要求包含事件的相關資訊,讓接收者可以據此採取動作。
由於其簡單起見,webhook 已由大量的服務公開,包括Dropbox、 GitHub、 Bitbucket、 MailChimp、 PayPal、時差、等量、Trello等等。 例如,WebHook 可以表示檔案已在Dropbox中變更,或已在 GitHub 中認可程式碼變更,或已在PayPal中起始付款,或已在Trello中建立卡片。 有無限的可能性!
Microsoft ASP.NET webhook 可讓您更輕鬆地在 ASP.NET 應用程式中傳送和接收 webhook:
在接收端,它會提供從任意數目的 WebHook 提供者接收和處理 Webhook 的一般模型。 除了支援Dropbox、 GitHub、 Bitbucket、 MailChimp、 PayPal、 Pusher、 Salesforce、空隙、 Stripe、 Trello、WordPress和Zendesk之外,還可以輕鬆地新增支援。
在傳送端,它會提供管理和儲存訂閱的支援,以及將事件通知傳送給適當的訂閱者集合。 這可讓您定義一組訂閱者可以訂閱的事件,並在發生事情時通知他們。
這兩個部分可以根據您的案例一起使用或分開使用。 如果您只需要接收來自其他服務的 Webhook,則可以只使用接收者部分;如果您只想要將 Webhook 公開給其他人使用,那麼您就可以這麼做。
程式碼會以 ASP.NET Web API 2 和 ASP.NET MVC 5 為目標,並在 GitHub 上以 OSS的形式提供。
Webhook 總覽
Webhook 是一種模式,這表示它從服務到服務的使用方式不同,但基本概念相同。 您可以將 Webhook 視為簡單的 pub/sub 模型,讓使用者可以訂閱其他地方發生的事件。 事件通知會傳播為 HTTP POST 要求,其中包含事件本身的相關資訊。
HTTP POST 要求通常包含 JSON 物件或由 WebHook 傳送者所決定的 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 webhook包含具有要求本文雜湊的X 中樞簽章 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 的位置。
在下列節點中,會詳細說明這些概念。