[ASP.NET]Microsoft ASP.NET WebHook - 處理不同的訂閱(By Id)

在大多的範例中,我們大多看到的是一個 Sender ,一個 Receiver。

但如果企業中有多個系統,總不能都用 1 對 1 的方式去處理吧!

所以我們可以使用 Id 來區別。

我們使用前一篇「[ASP.NET]Microsoft ASP.NET WebHook Preview」的範例,

調整 Receiver 專案可以處理預設的訂閱及Id為Product的訂閱。

1.在 web.config 中,多加入 Id 為 product 的 Secret,以逗號分隔,如下,

<appSettings>
	<add key="MS_WebHookReceiverSecret_Custom" 
		value="12345678901234567890123456789012,product=rainmaker0123456789rainmaker0123456789" />
</appSettings>

 

2.調整  DefaultHookHandler 中,如果 context?.Id 不為空,則不處理,如下,

public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
{
	//如果有 Id 則離開,只處理沒有 Id 的...
	if (context?.Id != "")
		return Task.FromResult(true);

	CustomNotifications data = context.GetDataOrDefault<CustomNotifications>();

	// 如果這裡會處理太久的話,建議將資料放到 Queue 之中慢慢處理,先回傳 true 
	//https://docs.asp.net/projects/webhooks/en/latest/receiving/handlers.html
	// Get data from each notification in this WebHook
	foreach (IDictionary<string, object> notification in data.Notifications)
	{
		var action = notification["Action"];
		JObject product = (JObject)notification["Product"];
	}
	return Task.FromResult(true);
}

 

3.新增一個 ProductHookHandler 來處理 context?.Id 為 product 的訂閱,如下,

public class ProductHookHandler : WebHookHandler
{
	 
	public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
	{
		//Id為product的才進來處理
		if (context?.Id != "product")
			return Task.FromResult(true);

		// Get data from WebHook
		CustomNotifications data = context.GetDataOrDefault<CustomNotifications>();

		// 如果這裡會處理太久的話,建議將資料放到 Queue 之中慢慢處理,先回傳 true 
		//https://docs.asp.net/projects/webhooks/en/latest/receiving/handlers.html
		// Get data from each notification in this WebHook
		foreach (IDictionary<string, object> notification in data.Notifications)
		{
			var action = notification["Action"];
			JObject product = (JObject)notification["Product"];
		}
		return Task.FromResult(true);
	}
}

 

再來就是在訂閱時,預設的URL為 api/webhooks/incoming/custom ,

如果 id 為 product ,就在後面再串接上 product ,

如 api/webhooks/incoming/custom/product 。

所以在 Index.cshtml 中,多加入處理 product 的訂閱,如下,

<form onsubmit="return subscribeProduct()">
    Subscribe Id = Product to all events <input type="submit" value="submit">
</form>

function subscribeProduct() {
    $.ajax({
        type: "POST",
        url: "/api/webhooks/registrations",
        data: JSON.stringify({
            WebHookUri: "http://localhost:1161/api/webhooks/incoming/custom/product",
            Secret: "rainmaker0123456789rainmaker0123456789",
            Description: "My first WebHook! for id product"
        }),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data, status) { alert(status); },
        failure: function (errMsg) { alert(errMsg); }
    });
    return false;
}

接著就來測試看看(Receiver 專案請用 Debug 方式),從 UI 上分別訂閱預設及product,

可以從 api/webhooks/registrations 來看訂閱的結果,如下,

再來按下 Trigger 新增的 Submit ,就可以分別在 DefaultHookHandler 及 ProductHookHandler ,

處理 Trigger 進來的資訊,各進入2次,所以前面我們使用 context?.Id 來判斷是否要處理,如下,

測試程式碼:Microsoft ASP.NET WebHook Preview 的測試專案

 

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^