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
相关产品推荐
相关产品推荐

