我正在使用SignalR 2,当我打开同一页面的多个标签时,我遇到了问题。打开4或5个选项卡后,所有请求都处于挂起状态,就像我超过浏览器允许的最大值一样。如果我关闭几个标签,一切都会再次运作。即使打开了所有选项卡,如果我打开其他浏览器也可以。这在Chrome和Firefox中都会发生。如果我禁用SignalR,我可以打开任意数量的标签。
这是我的代码:
// Reference the auto-generated proxy for the hub.
notificator.hub = $.connection.messageHub;
// Create a function that the hub can call back to display messages.
notificator.hub.client.refreshNotifications = function () {
// business code
};
$.connection.hub.start().done(function () {
notificator.hubStarted = true;
});
$.connection.hub.disconnected(function () {
notificator.hubStarted = false;
setTimeout(function () {
$.connection.hub.start();
}, 2000); // Restart connection after 2 seconds.
});
如果我删除了断开连接事件的处理程序,则问题仍然存在。通知系统正常工作,因此SignalR正在完成其工作,但它导致我在应用程序中出现问题。它甚至更慢。
答案 0 :(得分:2)
我找到了两个解决方案:
1)就我而言,它是一个Intranet Web应用程序,所以我知道每个人都支持WebSockets,而WebSockets没有连接限制。但是,为什么这不起作用?好吧,首先我通过添加以下行添加了对SignalR的记录:
$.connection.hub.logging = true;
然后我试图强制使用WebSockets:
$.connection.hub.start({ transport: 'webSockets' }).done(function () { .. });
但是,检查日志我发现WebSockets不受支持,因为它们没有安装在服务器中。所以,我在Windows 2012中按照这些步骤安装了它:
来源:http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-websocket-protocol-support
之后,一切正常。在Chrome中,在“网络”标签下,您将找到WS过滤器。点击它,你应该看到websocket。
2)使用IWC-SignalR:
https://github.com/slimjack/IWC-SignalR
它的工作原理如下:
其中一个窗口成为连接所有者(随机选择)和 保持真正的SignalR连接。如果连接所有者已关闭或 崩溃的另一个窗口成为连接所有者 - 这发生了 自动。窗口间通信是通过IWC完成的。