SignalR 在 Chrome 上使用服务器发送的事件
Posted
技术标签:
【中文标题】SignalR 在 Chrome 上使用服务器发送的事件【英文标题】:SignalR using server-sent event on Chrome 【发布时间】:2013-12-30 06:07:52 【问题描述】:我的问题:
我在 Chrome 上运行我的代码,请注意 SignalR 正在使用 html5 server-sent events
作为自动选择,太好了。但是,当我在服务器端刷新页面 onDisconnect()
时,直到 30 秒后才会触发。 Hub
中是否有任何设置可以立即响应断开连接事件?
我的观察:
请注意,延迟问题仅在我刷新页面时发生,而不是在我关闭浏览器时发生。 onDisconnect()
在关闭浏览器时立即触发。奇怪的东西@_@
版本限制:
我正在使用 SignalR 1.1.3(2.xx 之前的最新版本),因为我们公司没有 vs2013,而且我无法让 2.xx 在我的电脑上使用 vs2013 express。
请帮忙:)
【问题讨论】:
【参考方案1】:这是一个错误。每次推出新版本的浏览器时,我们都在努力解决这个问题,我们需要验证它是否仍然有效。这是该问题的突出错误https://github.com/SignalR/SignalR/issues/2719
【讨论】:
非常感谢 dfowler 的链接 :) 现在在 2.xx 版本下稳定吗? 这是 chrome 中的一个错误。我们实际上并没有解决任何问题。【参考方案2】:SignalR 在window.unload
事件中向OnDisconnected
发送一个ajax 请求,以通知服务器它中止了连接。如果它是异步的,则此 ajax 请求可能在文档卸载之前无法完成,或者它可能根本不被浏览器执行。这种行为似乎经常在不同的浏览器版本之间发生变化;我已经在各种版本的 Chrome 和 Firefox 中看到了这种失败。在 SignalR 2.x 中,该脚本还尝试在 onbeforeunload 中停止连接;我不确定这是否能完全解决问题。
如果上述 ajax 调用未完成,则 OnDisconnected
仅在 disconnect timeout 之后调用(默认为 30 秒)。您可以通过以下方式更改此设置:
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();
;
实际上效果很好。
【讨论】:
目前我们只是忽略它,但我会在我回到项目的那个部分时尝试一下,谢谢:) 我遇到了同样的问题。不幸的是,它在需要 jsonp 的 IE8 上。window.onbeforeunload
也不适合我。您是说可以修改单个方法调用以使用async: false
吗?您可以提供更多详细信息吗?
@murrayju 我的意思是你可以进行触发 OnDisconnected 同步的调用;你可以在 jquery.signalr-* 中(有条件地)这样做;相关方法的名称是“ajaxAbort”;但是,如果您可以通过不同的设计避免这种方法,我不会推荐这种方法以上是关于SignalR 在 Chrome 上使用服务器发送的事件的主要内容,如果未能解决你的问题,请参考以下文章
SignalR 不会使用 Chrome 或 IE 中的 VS2013 在 Windows 8 上与 IIS Express 建立连接
用于 websockets 内部的 Chrome DevTools 网络工具
SignalR - 在Windows窗体服务器上验证Windows窗体用户