You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会破坏运行时的上下文绑定。
解决方案

代码调整

  1. 还原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();
    }
}
  1. 调整启动类配置,添加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();
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:06:07