用途:把 Orleans 与 SignalR 集成,让 grain 或应用服务通过 IHubContext 向连接、组或用户推送消息,并支持离线用户队列与重启安全状态。
主要能力:连接、组、用户路由;离线用户消息队列(带投递 ID 与过期,确认后移除);心跳租约续期;观察者失败阈值、宽限期缓冲与断路器选项;命名 grain 存储用于连接元数据、队列消息、心跳注册与调用状态。
安装:同主机运行 silo 与 SignalR 端点时执行 dotnet add package ManagedCode.Orleans.SignalR.Server --version 10.3.0 与 dotnet add package ManagedCode.Orleans.SignalR.Client --version 10.3.0;分离主机时 Server 放 silo、Client 放 ASP.NET Core 端点。Core 传递共享契约,各参与方版本与分区选项需对齐。
配置:silo 侧调用 ConfigureOrleansSignalR(),本地开发可用 AddOrleansSignalRInMemoryStorage();AddSignalR().AddOrleans 可设 ConnectionPartitionCount、GroupPartitionCount、KeepMessageInterval、MaxQueuedMessagesPerUser。内存提供程序不跨 silo 重启;需持久离线投递时在 OrleansSignalROptions.OrleansSignalRStorage 注册持久 grain 存储。
发送与接收:向 grain 注入 IHubContext<UpdatesHub>,用 Clients.User/Group 的 SendAsync 推送;客户端先注册接收器再启动连接。userId 与组成员须来自已认证身份,不可信任客户端提供的名称。
限制:成功派发或入队不代表浏览器已应用更新,需用事件 ID 与幂等处理;MaxQueuedMessagesPerUser 默认 100,超限丢弃最旧条目;离线队列非无限事件日志。10.3.0 中 HubMessageState 由字典改为 QueuedHubMessage 列表,ISignalRInvocationGrain.WaitForCompletion 返回可取消的 IAsyncEnumerable,升级前需验证序列化与混合版本兼容。存储写入失败须可观测,内存测试不能证明持久恢复。