用途
SignalR 技能用于在 ASP.NET Core 应用中实现基于 WebSocket 的实时客户端-服务器通信。它主要服务于两类实时场景:一是通过 ActionsHub(蓝图服务)推送工作流操作通知;二是通过 RegisterHub(注册服务)推送账本(Register)相关事件。两个 Hub 都采用基于分组(Group)的广播方式,并使用查询参数携带 JWT 进行身份认证。
主要能力
- 强类型 Hub:通过
Hub<IRegisterHubClient>定义客户端接口,获得编译期类型安全。示例接口IRegisterHubClient包含RegisterCreated和TransactionConfirmed等方法。 - 分组路由:使用
Groups.AddToGroupAsync将连接加入指定分组,按分组广播消息。常见分组命名包括wallet:{address}、register:{id}、tenant:{id}。 - 从服务中发送:注入
IHubContext<THub>,在业务服务中调用_hubContext.Clients.Group(...).SendAsync(...)向指定分组推送消息。 - JWT 认证:客户端连接时通过
?access_token={jwt}查询参数传递令牌完成认证。
使用方式
Hub 注册在 Program.cs 中完成:先调用 builder.Services.AddSignalR(),再在认证中间件之后映射 Hub,例如 app.MapHub<ActionsHub>("/actionshub")、app.MapHub<RegisterHub>("/hubs/register")。
发送消息时需要注入 IHubContext,例如 NotificationService 中通过 _hubContext.Clients.Group($"wallet:{notification.WalletAddress}").SendAsync("ActionConfirmed", notification, ct) 推送通知。
客户端连接(测试用)通过 HubConnectionBuilder 构建:使用 WithUrl($"{baseUrl}/actionshub?access_token={jwt}"),通过 connection.On<ActionNotification>("ActionConfirmed", ...) 注册消息处理,调用 StartAsync() 启动连接,并用 InvokeAsync("SubscribeToWallet", walletAddress) 订阅。
服务抽象模式:为解耦业务逻辑与 SignalR 实现,可定义接口(如 INotificationService)并在依赖注入中注册(builder.Services.AddScoped<INotificationService, NotificationService>())。
适用场景
适用于需要在 ASP.NET Core 中实现实时通知、工作流状态推送、账本事件订阅等场景,尤其适合使用分组广播进行针对性消息分发的多租户或多钱包架构。
相关技能与限制
相关技能包括 aspire(服务编排与配置)、jwt(Hub 连接认证令牌设置)、redis(扩展用的 Backplane 配置)、xunit(集成测试模式)、fluent-assertions(Hub 测试断言)。
官方文档可通过 Context7 获取,推荐库 ID 为 /websites/learn_microsoft_en-us_aspnet_core,建议查询“SignalR hub groups authentication”“SignalR Redis backplane scaling”“SignalR strongly typed hubs”等主题。
关于收费、价格、平台兼容性等细节,当前资料暂未提供。