用途
SignalR 用于在 .NET(含 Blazor)应用中实现实时双向通信。资料以 NotificationHub 为例,说明如何通过 Hub 在服务端与客户端之间推送消息,覆盖广播、定向发送、分组、强类型调用、服务端主动推送以及多实例扩展等场景。
主要能力
Hub 定义与消息分发
示例 Hub 提供 SendMessage、JoinGroup、SendToGroup 等方法,并重写 OnConnectedAsync 跟踪连接。消息分发范围包括:
- Clients.All:广播给所有已连接客户端
- Clients.Client(targetConnectionId):发送给指定连接
- Clients.Others:发送给除调用者外的所有客户端
- Groups.AddToGroupAsync / Clients.Group:加入分组并向分组发送
- Groups.RemoveFromGroupAsync:移出分组
- Clients.GroupExcept(groupName, Context.ConnectionId):发送给分组内除调用者外的成员
服务端配置
通过 builder.Services.AddSignalR() 注册服务,并可配置 AddJsonProtocol 的 PropertyNamingPolicy 为 CamelCase;使用 app.MapHub<NotificationHub>("/hubs/notifications") 映射 Hub 端点。
Blazor Server 客户端
Blazor Server 本身已使用 SignalR 承载 circuit。若需额外 Hub,可在组件中通过 HubConnectionBuilder 配合 NavigationManager.ToAbsoluteUri 构建连接,使用 WithAutomaticReconnect 自动重连,通过 _hub.On<string, string> 注册接收回调,并在 DisposeAsync 中释放连接。
强类型 Hub
定义 INotificationClient 接口(如 ReceiveMessage、UserJoined、OrderUpdated),让 Hub 继承 Hub<INotificationClient>,从而以强类型方式调用客户端方法,例如 Clients.All.ReceiveMessage(user, message)。
服务端主动推送
在服务类中注入 IHubContext<NotificationHub, INotificationClient>,即可在业务逻辑(如订单状态更新)后向指定分组推送,例如 hub.Clients.Group($"order-{orderId}").OrderUpdated(...)。
横向扩展
通过 AddSignalR().AddStackExchangeRedis(连接字符串) 接入 Redis 背板,支持多实例部署下的消息同步。
JavaScript 客户端
使用 signalR.HubConnectionBuilder().withUrl("/chatHub").withAutomaticReconnect().build() 建立连接;connection.on 注册服务端调用的客户端方法,connection.invoke 调用服务端方法;提供 onreconnecting、onreconnected、onclose 生命周期回调,并通过 connection.start() 启动连接。
传输回退
SignalR 自动协商最佳传输方式:优先 WebSockets(全双工、低延迟),其次 Server-Sent Events(仅服务端到客户端、兼容性广),最后 Long Polling(受限环境回退)。
使用方式
- 定义 Hub 类并实现所需方法,必要时使用强类型接口。
- 在服务端注册 AddSignalR 并 MapHub 映射路径。
- 在 Blazor 组件或 JavaScript 客户端中构建 HubConnection,注册回调并启动连接。
- 如需从业务服务推送,注入 IHubContext 调用客户端方法。
- 多实例部署时配置 Redis 背板。
适用场景
资料列出的典型场景包括:游戏(实时游戏状态、玩家位置)、仪表盘(实时指标、告警、状态变化)、协作应用(共享白板、文档编辑)、通知(实时告警、聊天消息)、股票行情(实时价格与市场数据)、拍卖(实时出价更新)。
限制
资料未提供关于性能上限、并发连接数、授权与认证细节、版本兼容性、收费或价格等信息,这些内容暂未提供。