JQuery SignalR正常运行但长轮询每2秒循环,未收到定时推送怎么办?
问题根因及修复方案
- Hub上下文获取参数不匹配
你在LogHub类上标记了[HubName("logHub")]自定义Hub名称,但获取Hub上下文时传入的字符串为"LogHub",大小写不匹配导致无法拿到正确的上下文,消息无法推送给客户端。
推荐直接使用泛型重载获取上下文,避免手写名称出错,修改TimerElapsed方法如下:
private static void TimerElapsed(object sender, ElapsedEventArgs e) { // 泛型重载无需手动指定Hub名称,避免拼写/大小写错误 var hubContext = GlobalHost.ConnectionManager.GetHubContext<LogHub>(); hubContext.Clients.All.logMessage(string.Format("{0} - Still running", DateTime.UtcNow)); }
- 检查基础配置是否遗漏
- 确认你的项目中存在Owin Startup类,且在Configuration方法中已注册SignalR路由:
public void Configuration(IAppBuilder app) { app.MapSignalR(); // 其他配置 }
- 确认前端脚本引用顺序正确:先引入jQuery,再引入
jquery.signalR.js,最后引入SignalR自动生成的代理脚本/signalr/hubs,顺序错误会导致Hub代理无法正常初始化。
- 补充连接状态回调排查问题
你可以在前端启动SignalR的代码中增加连接成功/失败的回调,确认连接是否正常建立,同时你写了两层document ready嵌套属于冗余代码,可以简化:
$(function () { var logHubProxy = $.connection.logHub; logHubProxy.client.logMessage = function (msg) { $("#logUl").append("<li>" + msg + "</li>"); }; $.connection.hub.logging = true; $.connection.hub.start({ transport: 'longPolling' }) .done(function () { console.log("SignalR连接成功"); }) .fail(function (err) { console.log("连接失败,错误信息:", err); }); });
- 长轮询2秒循环说明
如果连接未成功建立,SignalR会按默认重试策略不断发起连接请求,就会出现每2秒一次的长轮询请求,修复上述问题连接成功后即可恢复正常的消息推送逻辑。
内容的提问来源于stack exchange,提问作者fletchsod
相关产品推荐
相关产品推荐

