asp.net - 直接从 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)的事件代理?
解决方案
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 服务的更多示例(例如codeproject、github、here)。
推荐阅读
- python - 在 python pandas 数据框中分配循环以提高性能
- jasper-reports - 在通过 Jrxml 模板生成的 Pdf 中获取空格而不是文本
- android - NDK SurfaceView 重绘在屏幕旋转时显示损坏
- r - 如何在 $ 之前和之后将“i”放在循环中
- spring - 迁移现有 Spring Websocket 处理程序以使用 rsocket
- ansible - 如何在保留键名上使用 Jinja2 过滤器?
- sql - TOAD for Oracle 错误地返回一周前的数据
- python - 根据其他列创建指示特定值历史存在的列
- ansible - 如何使用ansible获取远程机器的主机名并在配置文件中设置
- module - 层配置模块路由