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

多用户登录时SignalR的OnConnected方法未触发如何解决

问题根因

你的代码核心错误是客户端回调函数的注册顺序不对,ASP.NET SignalR要求所有客户端接收服务端消息的回调方法,必须在调用$.connection.hub.start()启动连接之前完成注册。你当前代码先启动连接,之后才注册connected回调,服务器的OnConnected方法在连接建立完成时就会立刻执行推送,这时候后续打开的客户端还没注册对应回调,推送的事件会被直接丢弃,所以你会误以为OnConnected没有被触发。

修复方案

1. 调整客户端代码顺序

将connected回调的注册逻辑移到启动连接之前,修正后的代码如下:

$(document).ready(function () {
    var notificationHub = $.connection.notificationHub;
    
    // 先注册所有客户端回调
    notificationHub.client.connected = function (message) {
        console.log('Hello' + message);
    };

    // 回调全部注册完成后再启动连接
    $.connection.hub.start().done(function () {
        console.log('Notification hub started');
    });
});

2. (可选)添加服务端日志确认触发

如果你需要确认OnConnected是否真的被触发,可以在方法中添加日志输出,避免因为客户端接收问题误判服务端执行状态:

public override Task OnConnected()
{
    // 输出用户身份和连接ID,可通过调试控制台或日志文件查看
    System.Diagnostics.Debug.WriteLine($"用户 {Context.User.Identity.Name} 建立连接,连接ID:{Context.ConnectionId}");
    Clients.Client(Context.ConnectionId).connected(Context.ConnectionId);
    return base.OnConnected();
}

注意事项

  • 你当前的Startup配置顺序是正确的,先执行身份认证配置再注册SignalR路由,符合带[Authorize]标记的Hub的使用要求
  • 不同浏览器的Cookie相互独立,只要账号登录状态正常,认证通过的请求建立SignalR连接一定会触发OnConnected方法
  • 如果调整顺序后仍有异常,请确认前端引用的jquery.signalr.js版本和服务端安装的Microsoft.AspNet.SignalR Nuget包版本完全一致,版本不匹配也会导致回调接收、连接建立异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:36:03