Azure Function调用SignalR发消息报服务未连接问题咨询
问题根因
- 混淆了ASP.NET Core SignalR Hub的使用场景:Isolated Worker模式的Azure Function默认不对外暴露Hub的HTTP端点,客户端无法连接到Hub,自然
OnConnectedAsync永远不会触发。 - 调用方式错误:Azure SignalR Service在Default模式下需要服务端先和SignalR服务建立有效连接才能发消息,你直接单例化Hub类调用方法,没有走SignalR的连接初始化逻辑,就会触发「服务未连接」的报错。
- 依赖注入配置错误:常规场景下Hub是由SignalR运行时动态创建的,你手动单例注册
NotificationHub会破坏运行时的上下文绑定。
解决方案
代码调整
- 还原NotificationHub为标准写法,删除自行注入
IHubContext的逻辑:
public class NotificationHub : Hub { public override async Task OnConnectedAsync() { var companyIds = Context.User?.GetCompanyIds(); if (companyIds != null) { foreach (var companyId in companyIds) { await Groups.AddToGroupAsync(Context.ConnectionId, companyId.ToString()); } } await base.OnConnectedAsync(); } }
- 调整启动类配置,添加Hub端点映射,删除手动注册Hub的代码:
public static void Main() { var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureFunctionsWebApplication() .ConfigureServices(s => { s.AddSignalR().AddAzureSignalR(SignalRConnectionString); }) .Configure(app => { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapHub<NotificationHub>("/notificationHub"); }); }) .Build(); host.Run(); }
- Azure Function触发逻辑中直接注入
IHubContext<NotificationHub>发消息,不要调用Hub类的自定义方法:
public class YourTriggerFunction { private readonly IHubContext<NotificationHub> _hubContext; public YourTriggerFunction(IHubContext<NotificationHub> hubContext) { _hubContext = hubContext; } [Function("YourTriggerFunction")] public async Task Run([YourTriggerAttribute] string triggerInput) { await _hubContext.Clients.Group("目标企业ID").SendAsync("ReceiveMessage", "SignalR", "要发送的消息内容"); } }
验证步骤
- 客户端连接地址配置为你的Function访问域名+/notificationHub,连接成功后
OnConnectedAsync会正常触发 - 触发Azure Function后,消息可正常推送到对应分组的客户端
- 如果你没有客户端主动连接Hub的需求,可以直接调用Azure SignalR的REST API发消息,不需要注册和配置Hub。
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

