跨域连接SignalR Hub出现“未订阅任何Hub”错误,求技术协助
解决SignalR跨域连接成功但提示"No hubs have been subscribed to"的问题
我一眼就看出问题所在了——你的跨域客户端代码没有订阅任何Hub的客户端回调方法。SignalR的机制是:只有当客户端明确注册了至少一个Hub的客户端方法(也就是hub.client.xxx形式的定义),服务器才会认定你已经订阅了该Hub,否则就会输出你看到的那条日志。
对比你提供的同域客户端代码,那边明确定义了hub.client.broadcastMessage方法,而跨域客户端里完全没有这部分逻辑,这就是核心差异。
修正后的跨域客户端代码
<script src="~/scripts/jquery-1.6.4.min.js"></script> <script src="~/scripts/jquery.signalR-2.2.2.min.js"></script> <!-- 注意:跨域场景下,必须从服务端完整URL加载hubs代理脚本,相对路径会失效 --> <script src="http://localhost:2372/signalr/hubs"></script> <script> $(function () { // 获取ChattingHub的代理对象 var hub = $.connection.chattingHub; // 关键步骤:注册至少一个客户端回调方法,这是订阅Hub的必要条件 hub.client.broadcastMessage = function (name, message) { // 这里可以根据业务需求处理收到的消息,比如打印到控制台或渲染到页面 console.log(`收到服务端推送:${name} 说:${message}`); }; // 配置跨域SignalR服务地址 $.connection.hub.url = 'http://localhost:2372/signalr'; $.connection.hub.logging = true; // 启动连接 $.connection.hub.start().done(function () { console.log("跨域连接成功,已成功订阅ChattingHub"); // 如果需要,这里可以调用服务端Hub的方法,比如发送初始化消息 // hub.server.sendMessage("跨域客户端", "我已上线"); }).fail(function (error) { console.error("连接启动失败:", error); }); }); </script>
关键修改点说明
- 添加客户端方法注册:新增的
hub.client.broadcastMessage方法告诉SignalR,客户端需要接收该Hub的推送消息,服务器会据此完成Hub的订阅流程,不再提示未订阅。 - 修正hubs脚本路径:跨域场景下,相对路径
../signalr/hubs无法正确加载服务端生成的代理脚本,必须使用服务端的完整URL加载。 - 增加连接失败处理:补充
fail回调方便排查后续可能出现的连接问题。
服务端跨域配置确认(额外提醒)
虽然你说已经启用跨域,但还是建议确认服务端的Cors配置是否正确(以Owin为例),确保在MapSignalR之前启用Cors:
using Microsoft.Owin.Cors; using Owin; public class Startup { public void Configuration(IAppBuilder app) { // 必须在MapSignalR之前启用Cors app.UseCors(CorsOptions.AllowAll); // 配置SignalR路由 app.MapSignalR(); } }
这样修改后,你的跨域客户端就能正常订阅Hub,不会再出现那条日志错误了。
内容的提问来源于stack exchange,提问作者Muhammad Waqas
相关产品推荐
相关产品推荐

