Ajax 信号器2-打开多个选项卡后挂起AJX请求

Ajax 信号器2-打开多个选项卡后挂起AJX请求,ajax,signalr,Ajax,Signalr,我正在使用Signalr2,当我打开同一页面的多个选项卡时遇到问题。打开4或5个选项卡后,所有请求都处于挂起状态,就像我超出了浏览器允许的最大值一样。如果我关闭几个选项卡,一切都会恢复正常。即使所有的标签都打开了,如果我打开一个不同的浏览器,它也能工作。这在Chrome和Firefox中都会发生。如果禁用信号器,我可以打开任意多个选项卡 这是我的代码: // Reference the auto-generated proxy for the hub. notificator.hub

我正在使用Signalr2,当我打开同一页面的多个选项卡时遇到问题。打开4或5个选项卡后,所有请求都处于挂起状态,就像我超出了浏览器允许的最大值一样。如果我关闭几个选项卡,一切都会恢复正常。即使所有的标签都打开了,如果我打开一个不同的浏览器,它也能工作。这在Chrome和Firefox中都会发生。如果禁用信号器,我可以打开任意多个选项卡

这是我的代码:

// 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.
    });
如果删除断开连接事件的处理程序,则问题仍然存在。通知系统工作正常,因此Signaler正在执行其工作,但它在应用程序中引发了问题。它甚至更慢。

我找到了两种解决方案:

1) 在我的例子中,它是一个intranet web应用程序,所以我知道每个人都支持WebSocket,WebSocket没有连接限制。但是,为什么这不起作用呢?首先,我在SignalR中添加了日志记录,添加了这一行:

$.connection.hub.logging = true;
然后我尝试强制使用WebSocket:

$.connection.hub.start({ transport: 'webSockets' }).done(function () { .. });
但是,通过查看日志,我发现WebSocket不受支持,因为它们没有安装在服务器中。因此,我在Windows 2012中遵循了以下步骤并安装了它:

  • 打开服务器管理器
  • 在管理菜单下,单击添加角色和功能
  • 选择基于角色或基于功能的安装,然后单击 下一个
  • 选择适当的服务器(您的本地服务器由 默认设置),然后单击下一步
  • 在角色树中展开Web服务器(IIS),然后展开Web服务器, 然后扩展应用程序开发
  • 选择WebSocket协议,然后单击下一步
  • 单击安装
  • 资料来源:

    在那之后,一切顺利。在Chrome的“网络”选项卡下,您会发现一个WS-filter。单击它,您将看到websocket

    2) 使用IWC信号器:

    它是这样工作的:

    其中一个窗口成为连接所有者(随机选择)并 保持真正的信号机连接。如果连接所有者已关闭或 崩溃的另一个窗口成为连接所有者-这种情况会发生 自动地窗口间通信通过IWC完成