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

如何使用Microsoft.AspNet.SignalR 2.4.3客户端调用Microsoft.AspNetCore.SignalR 6.0.1服务端?

如何使用Microsoft.AspNet.SignalR 2.4.3客户端调用Microsoft.AspNetCore.SignalR 6.0.1服务端?

这是一个典型的版本兼容问题——Microsoft.AspNet.SignalR 2.x(旧版)和Microsoft.AspNetCore.SignalR 6.x(新版)使用完全不同的通信协议,直接用旧客户端连接新服务端必然会失败,你遇到的404错误就是因为旧客户端自动追加了/signalr/negotiate路径,而新服务端的路由规则完全不匹配这个格式。

下面给你最可行的解决方案:

核心思路:并行使用两个版本的SignalR客户端

你的应用本身已经在使用旧版SignalR和本地服务端通信,不需要改动这部分逻辑;同时在页面中引入新版ASP.NET Core SignalR的客户端JS,专门用来连接远程的6.0.1服务端。两个客户端可以共存,不会互相干扰。

步骤1:引入新版SignalR客户端JS

在你的页面中,除了原本的旧版SignalR脚本,再添加新版的客户端脚本(可以用CDN,也可以下载到本地):

<!-- 原有旧版SignalR客户端(保持不变) -->
<script src="/signalr/jquery.signalR-2.4.3.min.js"></script>
<!-- 新增ASP.NET Core SignalR 6.0.1客户端 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.1/signalr.min.js"></script>

步骤2:用新版客户端连接远程服务端

替换你原来的远程连接代码,使用新版客户端的HubConnectionBuilder来创建连接,完全按照服务端开发者给的示例来写(这部分代码和旧版客户端互不冲突,因为新版用的是独立的signalR命名空间):

// 连接远程ASP.NET Core 6.0 SignalR服务端
var remoteSignalRConnection = new signalR.HubConnectionBuilder()
    .withUrl("https://api.myservice.com/signalR/main") // 直接用服务端给的完整URL
    .build();

// 启动连接并调用JoinSession方法
remoteSignalRConnection.start()
    .then(() => {
        console.log("远程SignalR连接成功");
        // 调用服务端的JoinSession方法
        return remoteSignalRConnection.invoke('JoinSession', uID, "mySession");
    })
    .then(() => {
        console.log('JoinSession 调用成功');
    })
    .catch(error => {
        console.error('操作失败:', error);
    });

// 原有本地旧版SignalR连接逻辑保持不变
let tmHub = null;
try {
    tmHub = j$.connection.tmHub;
} catch (e) {
    console.error('无法访问本地SignalR tmHub')
}

if (tmHub) {
    tmHub.client.updateMapAssetID = _updateMapAssetID;
    j$.connection.hub.start();
}

为什么这个方案可行?

  • 旧版SignalR客户端(2.4.3)和新版(6.0.1)的JS对象是独立的:旧版用j$.connection,新版用signalR命名空间,不会产生变量冲突。
  • 新版客户端完全适配ASP.NET Core SignalR的协议,不会像旧客户端那样自动追加多余的/signalr路径,正好匹配服务端的路由规则。

不需要修改本地的SignalRConfig配置

你本地的SignalRConfig是用来配置本地旧版SignalR服务端的,和远程的新版服务端没有关系,不需要做任何改动——远程连接是前端直接和远程服务端建立的,不需要经过本地服务端中转。

其他注意事项

  • 服务端提到的“call without a hub”其实是表述问题:ASP.NET Core SignalR必须依赖Hub,只是他们的路由已经直接映射到了对应的Hub(比如MainHub),所以你不需要在代码中额外指定Hub名称,直接用给定的URL即可。
  • 如果你的应用有CORS限制,需要确保远程服务端已经配置了允许你的客户端域名跨域请求。

备注:内容来源于stack exchange,提问作者bzamfir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 08:13:03