SignalR 2 - 打开多个选项卡后等待AJX请求

时间:2015-12-16 14:58:54

标签: ajax signalr

我正在使用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正在完成其工作,但它导致我在应用程序中出现问题。它甚至更慢。

1 个答案:

答案 0 :(得分:2)

我找到了两个解决方案:

1)就我而言,它是一个Intranet Web应用程序,所以我知道每个人都支持WebSockets,而WebSockets没有连接限制。但是,为什么这不起作用?好吧,首先我通过添加以下行添加了对SignalR的记录:

$.connection.hub.logging = true;

然后我试图强制使用WebSockets:

$.connection.hub.start({ transport: 'webSockets' }).done(function () { .. });

但是,检查日志我发现WebSockets不受支持,因为它们没有安装在服务器中。所以,我在Windows 2012中按照这些步骤安装了它:

  1. 打开服务器管理器。
  2. 在“管理”菜单下,单击“添加角色和功能”。
  3. 选择基于角色或基于功能的安装,然后单击 下一步。
  4. 选择适当的服务器(选择本地服务器) 默认),然后单击“下一步”。
  5. 在“角色”树中展开“Web服务器(IIS)”,然后展开“Web服务器”, 然后扩展应用程序开发。
  6. 选择“WebSocket协议”,然后单击“下一步”。
  7. 单击“安装”。
  8. 来源: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完成的。