我正在开发一个需要响应第三方WebHook事件的应用程序。我选择Azure Event Grid作为事件代理,选择Angular作为前端,选择Asp.Net Core作为后端。
在当前解决方案中,我正在使用HTTP触发的Azure函数从WebHook发布到Azure事件网格。此函数将第三方事件格式化为正确的Azure事件网格格式(以相关事件用户为主题,事件类型为WebHook事件类型)。现在,使用WebHook Azure事件网格订阅将事件网格事件推送到我的Asp.Net后端。
我的问题是某些事件仅与前端有关(例如提醒/通知),因此我想直接将事件从事件网格发布到前端,而无需在后端使用WebSocket到端点。
我目前正在使用SignalR在Angular和Asp.Net Core之间创建WebSocket连接,但是我不想通过发送将被重定向到Angular的事件来使后端过载。
是否可以使用WebSocket连接直接订阅Azure事件网格?就最小推送/轮询而言,什么是最佳解决方案?还是我应该切换到另一个具有JavaScript库的事件代理(例如RabbitMQ)?
答案 0 :(得分:1)
Azure SignalR Service可以帮助您集成客户端(如Asp.net,Angular等),以使用Azure Event Grid事件。以下屏幕片段显示了使用webhook事件处理程序终结点的逻辑订户(客户端)的示例。
如上图所示, EventGridTrigger 函数代表Azure SignalR服务的集成商。 AF已针对SignalR Service绑定进行了扩展,请参见更多详细信息here。
使用此扩展,EventGridTrigger函数作为SignalR Service的集成器非常简单,轻巧,请参见以下示例:
#r "Microsoft.Azure.EventGrid"
#r "Microsoft.Azure.WebJobs.Extensions.SignalRService"
#r "Newtonsoft.Json"
using Microsoft.Azure.EventGrid.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
public static async Task Run(EventGridEvent eventGridEvent, IAsyncCollector<SignalRMessage> signalRMessages, ILogger log)
{
await signalRMessages.AddAsync(
new SignalRMessage
{
Target = "Notify",
Arguments = new[] { eventGridEvent.Data.ToString() }
});
}
和function.json:
{
"bindings": [
{
"type": "eventGridTrigger",
"name": "eventGridEvent",
"direction": "in"
},
{
"type": "signalR",
"name": "signalRMessages",
"hubName": "mySignalRService/users/myClientId",
"connectionStringSetting": "AzureSignalRConnectionString",
"direction": "out"
}
]
}
还要查看更多在客户端使用Azure SignalR服务的示例(例如codeproject,github,here)。