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 建立连接

将 Redis 与 SignalR 一起使用

用于 websockets 内部的 Chrome DevTools 网络工具

SignalR - 在Windows窗体服务器上验证Windows窗体用户

SignalR 2.0 CORS Chrome 禁用 Web 安全奇怪行为

SignalR 从 WPF 服务器向 WPF 客户端发送消息