SignalR 和浏览器连接限制

2024-02-18

我用 SignalR 制作了一个简单的应用程序进行测试。当页面加载时,它会调用服务器上的函数,该函数然后调用在屏幕上打印消息的客户端函数。我这样做是为了检查客户端和服务器功能是否正常工作以及 SignalR 通信是否正常。

我的问题是,如果我在两个不同的选项卡上打开同一页面(在 Chrome 中打开),第一个页面加载正常,但第二个页面不会调用服务器的功能 - 仅当我关闭第一个页面时。

据我了解,它们可能是与浏览器相关的连接限制,不允许 SignalR 连接一次以上(实际上是两个,一个用于接收,一个用于发送)

更新:我发现其他选项卡已打开,但现在我已经检查过了并且它允许只有 4 个标签/ 通过连接激活的页面。如果我尝试将同一页面放在新选项卡上,则不会发送任何数据,当我关闭其他选项卡之一时,新选项卡会立即发送数据。

我想知道是否有任何解决方案,因为如果用户决定在两个或更多选项卡上打开同一页面,我希望此连接可用。

我不相信它与 IIS 有任何关系,因为据我所知它可以接受数千个连接。


这个问题最好在未来得到解决频道消息传递 http://www.whatwg.org/specs/web-apps/current-work/multipage/web-messaging.html#channel-messaging规范,迄今为止尚未被任何浏览器实现,但我设法通过以下方式解决了它限制连接数 http://www.codetunnel.com/cannot-have-many-tabs-open-with-signalr正如亚历克斯·福特所描述的并使用localStorage作为选项卡之间的消息总线。

The storage事件允许您在选项卡之间传播数据,同时保持单个 SignalR 连接打开(从而防止连接饱和)。呼唤localStorage.setItem('sharedKey', sharedData)将提高storage所有其他选项卡中的事件(不是调用者):

$(window).bind('storage', function (e) {
    var sharedData = localStorage.getItem('sharedKey');
    if (sharedData !== null)
        console.log(
            'A tab called localStorage.setItem("sharedData",'+sharedData+')'
        );
});

你可以测试if ($.connection.hub.state === 1)确定给定选项卡是否应通过 localStorage 通知其他选项卡(由 Alex 提供)以防止重复localStorage.setItem calls.

Facebook 通过在多个子域上提供持久连接来克服此浏览器限制,但这可能会使部署和测试变得复杂。

Caveats

旧连接:在Alex的解决方案中,你需要小心Disconnect()没有被调用(例如例外),并且您填写了您的HubConnections具有旧集线器连接的存储桶(或存储库)。如果会话 ID 没有更改(可能会发生),这可能会阻止新客户端建立 SignalR 连接,即使没有活动的连接。或者,为新连接添加时间戳并设置滑动过期时间,以最大程度地减少潜在影响。

Locking: localStorage可能会受到竞争条件的影响,因为它没有实现任何锁定此处描述 http://balpha.de/2012/03/javascript-concurrency-and-locking-the-html5-localstorage/.

为了支持不同类型的事件,您应该编码事件类型在您的 JSON 消息中并对其进行测试storage event.

后备措施

如果无法建立 SignalR 连接,我会每 45 秒轮询一次服务器以检索通知计数。

如果你不想使用localStorage,你可以使用cookie,但它不太干净。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SignalR 和浏览器连接限制 的相关文章

随机推荐