首页 > 解决方案 > 直接从 Angular 客户端订阅 Azure 事件网格主题

问题描述

我正在开发一个需要响应来自第三方 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)的事件代理?

在此处输入图像描述

标签: asp.netangularpublish-subscribemessagebrokerazure-eventgrid

解决方案


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

在此处输入图像描述

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

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

#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)。


推荐阅读