繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM