SignalR在Chrome上使用服务器发送的事件

我的问题:

我正在Chrome上运行我的代码,注意SignalR正在使用html5 server-sent events作为自动选择,很棒。 但是,当我刷新服务器端的onDisconnect()页面时,直到30秒后才会触发。 在Hub是否有任何设置可以立即对断开事件做出响应?

我的观察:

请注意,延迟问题仅发生在I刷新页面上,而不是在我关闭浏览器时。 关闭浏览器时, onDisconnect()会立即触发。 奇怪的事情 @_@

版本限制:

我使用的是SignalR 1.1.3(2.xx之前的最新版本),因为我们公司没有vs2013而且无论如何我都无法在我的电脑上使用2.xx与vs2013 express一起工作。

请帮忙 :)

这是一个错误。 每当新版本的浏览器出现时我们都会遇到困难,我们需要validation该东西是否仍然有效。 这是该问题的突出错误https://github.com/SignalR/SignalR/issues/2719

SignalR在window.unload事件中向OnDisconnected发送ajax请求,以通知服务器中止连接。 如果文档是异步的,则在文档卸载之前可能无法完成此ajax请求,或者根本不会被浏览器执行。 这种行为似乎在不同浏览器版本之间发生变化; 我在各种版本的Chrome和Firefox中都看到了这种情况。 在SignalR 2.x中,脚本还尝试在onbeforeunload中停止连接; 我不确定这是否完全解决了这个问题。

如果所述ajax调用未完成,则仅在断开连接超时 (默认为30秒)后调用OnDisconnected 。 您可以通过以下方式更改此设置

 GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30); 

您可以尝试修改SignalR脚本,以便在从window.unload中止时始终使用async: false ,这可能会增加您的方案中完成调用的几率。 但是,从window.unload执行同步调用也可能被浏览器认为是不好的做法,因为它可能会使页面无法卸载。 因此浏览器可能决定不允许这样的呼叫。 我在自托管跨域设置中遇到了与SignalR 2.0-rc1相同的问题,到目前为止还没有找到一个好的解决方案。 因此,最终似乎依赖于立即调用OnDisconnected可能并不明智。

我注意到的一个问题是,如果你使用jsonp: true启动集线器连接,即使你关闭标签也不会通知服务器 – 在这种情况下,将ajax调用的dataType设置为“text”将至少是部分修复。

我现在看到有一个更具说服力的答案,但无论如何我都会发布这个。

编辑:

在这里使用它

 window.onbeforeunload = function (e) { $.connection.hub.stop(); }; 

实际上效果很好。