直接从Angular客户端订阅Azure事件网格主题

时间:2019-07-19 10:41:23

标签: asp.net angular publish-subscribe messagebroker azure-eventgrid

我正在开发一个需要响应第三方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)?

enter image description here

1 个答案:

答案 0 :(得分:1)

Azure SignalR Service可以帮助您集成客户端(如Asp.net,Angular等),以使用Azure Event Grid事件。以下屏幕片段显示了使用webhook事件处理程序终结点的逻辑订户(客户端)的示例。

enter image description here

如上图所示, 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服务的示例(例如codeprojectgithubhere)。