如何使用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
相关产品推荐
相关产品推荐

