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

Fer*_*oul 4 asp.net publish-subscribe messagebroker angular 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)?

在此输入图像描述

Rom*_*iss 6

Azure SignalR 服务可以帮助你集成 Asp.net、Angular 等客户端来使用 Azure 事件网格事件。以下屏幕片段显示了使用 Webhook 事件处理程序端点的逻辑订阅者(客户端)的示例。

在此输入图像描述

如上图所示,EventGridTrigger函数代表 Azure SignalR 服务的集成器。AF 已针对 SignalR 服务绑定进行了扩展,请在此处查看更多详细信息。

使用此扩展,EventGridTrigger 函数作为 SignalR 服务的集成器非常简单且轻量级,请参阅以下示例:

#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() }
        });
}
Run Code Online (Sandbox Code Playgroud)

和 function.json:

{
  "bindings": [
    {
      "type": "eventGridTrigger",
      "name": "eventGridEvent",
      "direction": "in"
    },
    {
      "type": "signalR",
      "name": "signalRMessages",
      "hubName": "mySignalRService/users/myClientId",
      "connectionStringSetting": "AzureSignalRConnectionString",
      "direction": "out"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

另外,请查看更多在客户端使用 Azure SignalR 服务的示例(例如codeprojectgithub此处)。