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

SignalR Hub连接成功但OnConnectedAsync方法未触发问题

SignalR连接返回101但OnConnectedAsync未触发的排查方案

核心原因:普通HTTP客户端未完成SignalR协议握手

Postman/Insomnia返回101仅代表HTTP到WebSocket的协议切换成功,但它们并未遵循SignalR专属的握手协议——SignalR要求客户端发送包含协议版本、传输类型等参数的握手请求,否则服务器不会将连接关联到Hub实例,自然不会触发OnConnectedAsync。

具体排查与解决步骤

  • 改用SignalR官方客户端测试
    不要用普通HTTP工具,使用官方客户端库发起连接。例如用浏览器控制台的JS代码:

    const connection = new signalR.HubConnectionBuilder()
        .withUrl("wss://localhost:7090/chat-hub")
        .build();
    
    connection.on("method", (message) => {
        console.log(message);
    });
    
    connection.start().catch(err => console.error(err));
    
  • 补充基类方法调用
    在OnConnectedAsync中显式调用基类方法,确保SignalR内部连接逻辑正常执行:

    public override async Task OnConnectedAsync()
    {
        await Clients.All.SendAsync("method", "someone connected");
        await base.OnConnectedAsync(); // 必须调用基类方法
    }
    
  • 验证断点与日志
    若依赖断点调试,确保:

    • 项目以调试模式启动(F5而非Ctrl+F5)
    • 断点未被代码优化屏蔽(右键断点勾选"允许我的代码")
      也可添加日志输出替代断点,确认连接事件是否触发:
    using Microsoft.Extensions.Logging;
    
    public class ChatHub : Hub
    {
        private readonly ILogger<ChatHub> _logger;
    
        public ChatHub(ILogger<ChatHub> logger) => _logger = logger;
    
        public override async Task OnConnectedAsync()
        {
            _logger.LogInformation("客户端已连接:{ConnectionId}", Context.ConnectionId);
            await Clients.All.SendAsync("method", "someone connected");
            await base.OnConnectedAsync();
        }
    }
    
  • 确认路由与端口匹配
    检查launchSettings.json中的HTTPS端口是否为7090,确保连接URLwss://localhost:7090/chat-hub与MapHub<ChatHub>("chat-hub")的路由完全一致(末尾不要加斜杠)。

内容的提问来源于stack exchange,提问作者Dylan Melhuish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:28:27