[英]SignalR using server-sent event on Chrome
我的问题:
我在Chrome上运行我的代码,注意SignalR正在使用html5 server-sent events
作为自动选择,很棒。 但是,当我刷新服务器端的onDisconnect()
页面时,直到30秒后才会触发。 Hub
是否有任何设置可以立即对断开事件做出响应?
我的观察:
请注意,延迟问题仅在我刷新页面时发生,而不是在我关闭浏览器时。 关闭浏览器时, onDisconnect()
会立即触发。 奇怪的事情 @_@
版本限制:
我使用的是SignalR 1.1.3(2.xx之前的最新版本),因为我们公司没有vs2013而且无论如何我都无法使用2.xx与vs2013 express一起工作。
请帮忙 :)
这是一个错误。 我们在每次浏览器的新版本出现时都会遇到困难,我们需要验证该东西是否仍然有效。 这是该问题的突出错误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();
};
实际上工作得很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.