双应用共用Azure SignalR时控制台应用访问已连接客户端方法
你现在控制台没法给已连接客户端发消息,核心问题出在Hub不匹配:Azure SignalR是按Hub名称做逻辑隔离的,你控制台里注入的是基类Hub的上下文,和Web API里定义的ClientHub根本不是同一个通道,两边的组、连接池完全不互通,消息自然发不到客户端。
按下面的步骤改就能正常用:
修正配置
- 对齐两端Hub定义
两个应用必须用完全同名的Hub才能共享同一个Azure SignalR通道。最省事的方案是把Web API里的ClientHub抽到两个项目都引用的共享类库;不想抽类库的话,直接在控制台项目里建个同名空类就行,不需要写任何业务逻辑,只要命名空间、类名和Web API端的ClientHub完全一致:
如果你之前给Hub加过public class ClientHub : Hub { }[HubName]特性自定义名称,两端的自定义名称也要完全一样。 - 修正控制台的上下文注入
把控制台SignalRService里注入的IHubContext<Hub>改成IHubContext<ClientHub>,和Web API端的泛型参数保持一致,发消息的业务逻辑不用动:public class SignalRService : IDataPushService { private readonly IHubContext<ClientHub> _hubContext; public SignalRService(IHubContext<ClientHub> hubContext) { _hubContext = hubContext; } public Task Receive(string data) => Task.FromResult(0); public async Task Send(PushServiceDataPackage dataPackage) { await _hubContext.Clients.Group(dataPackage.GroupName) .SendAsync(dataPackage.EventType.ToString(), dataPackage.Data); } } - 校验基础配置
两个项目用的Azure SignalR连接字符串必须完全一致。控制台不需要调用MapHub配置端点——它不需要承接客户端的连接请求,客户端只需要连Web API暴露的Hub地址就可以。
在线客户端查询说明
Azure SignalR没有提供直接枚举全量在线连接、在线组的公开接口,如果你需要在控制台里获取所有在线客户端列表,要自己做状态同步:
在Web API端的ClientHub里,通过OnConnectedAsync、OnDisconnectedAsync生命周期方法,把连接ID、关联的用户标识、所属组信息写入两个应用都能访问的共享存储(比如Redis、分布式缓存、数据库),控制台要查在线信息直接读这份存储即可。不要尝试从本地IHubContext里取连接列表,跨应用部署时本地不会存全量连接数据,所有路由信息都托管在Azure SignalR服务侧。
内容的提问来源于stack exchange,提问作者Fouad
相关产品推荐
相关产品推荐

