用途:在 ASP.NET Core 中实现带认证的实时推送与可预测分组。资料明确提示:不要用 SignalR 处理 HTTP 就能解决的 CRUD。
主要能力与范围:Hub 负责服务端与客户端双向 RPC;IHubContext 用于从 Hub 外部(HTTP 处理器、后台任务)发送消息;多实例时使用 Redis 背板或 Azure SignalR;客户端可用 @microsoft/signalr 或 .NET HubConnection。WebSockets 在 Go/Rust 中对应 golang-websocket / rust-axum-websocket,gRPC 流对应 grpc。
组织方式:Hubs/ 放 OrdersHub.cs 与 HubFilters/,Realtime/ 放使用 IHubContext 的 OrderNotifier.cs。Hub 保持精简,只做授权与分发,业务规则放在应用服务;载荷契约需版本化(如 OrderUpdatedV1)。
必要规则:连接必须认证(按客户端在 query/header 传 JWT),不设公开 Hub;按消息和分组授权,例如只有能查看订单的用户才能加入 order:{id};多副本必须用背板或 Azure SignalR,IMemory 仅限单进程;设置超时与 KeepAlive,客户端用退避重连,服务端不假设 socket 永久;不要用长 I/O 阻塞 Hub,使用 async 与 CT,重 CPU 移出;载荷要小,只传 ID,需要时客户端再加载。
用法要点:Hub 上标 [Authorize],在 JoinOrder 中先校验权限再加入分组,Context.User 来自认证中间件,将 NameIdentifier 映射为用户 id;HubException 会变成客户端错误,不要泄露内部信息;用 OnConnectedAsync / OnDisconnectedAsync 处理在线状态与分组清理。Hub 外调用形如 hubContext.Clients.Group($"order:{id}").SendAsync("orderUpdated", dto, ct),应在提交后调用,关键事件用 outbox;客户端方法名要稳定,破坏性变更用版本名(如 orderUpdatedV2)。
客户端与扩展:在 AccessTokenProvider 中放 token 工厂以支持刷新;启用 withAutomaticReconnect,并在 onreconnected 中重新加入分组;有契约包时共享 TS/C# 类型。Azure 环境且连接负载是瓶颈时可用 Azure SignalR Service;Redis 背板需同密码/DB,粘性会话不能替代背板做扇出;如有风险可限制每用户连接数。
反模式:把 Hub 当 CRUD API;用 Clients.All 广播某租户数据;多实例无背板;只在 HTTP 认证而 Hub 匿名;载荷携带被跟踪的 EF 实体。
与其他技能集成:HTTP 宿主 aspnet-core,测试 csharp-testing,授权 authentication-authorization,契约 api-design。完成标准:Hub 已认证、分组有授权、多实例有背板、客户端可重连并重入分组、事件在持久化后(或 outbox)发出、载荷版本化且小。