C# 在Chrome上使用服务器发送事件的信号器
我的问题是: 我在Chrome上运行我的代码,注意到SignalR使用html5服务器发送事件作为自动选择,很好。然而,当我刷新页面时,服务器端的onDisconnect直到30秒后才启动。集线器中是否有任何设置可以使其在断开连接事件时立即响应 我的观察: 请注意,延迟问题仅发生在刷新页面时,而不是在关闭浏览器时。关闭浏览器时,onDisconnect会立即启动。怪事@_@ 版本限制: 我使用的是2.x.x之前的最新版本SignalR 1.1.3,因为我们公司没有vs2013,我无法在我的pc上使用vs2013 expressC# 在Chrome上使用服务器发送事件的信号器,c#,javascript,google-chrome,signalr,C#,Javascript,Google Chrome,Signalr,我的问题是: 我在Chrome上运行我的代码,注意到SignalR使用html5服务器发送事件作为自动选择,很好。然而,当我刷新页面时,服务器端的onDisconnect直到30秒后才启动。集线器中是否有任何设置可以使其在断开连接事件时立即响应 我的观察: 请注意,延迟问题仅发生在刷新页面时,而不是在关闭浏览器时。关闭浏览器时,onDisconnect会立即启动。怪事@_@ 版本限制: 我使用的是2.x.x之前的最新版本SignalR 1.1.3,因为我们公司没有vs2013,我无法在我的pc上
请帮助:这是一个bug。每次新版本的浏览器出现时,我们都会遇到一个难题,我们需要验证它是否仍然有效。这是该问题的突出缺陷这是一个缺陷。每次新版本的浏览器出现时,我们都会遇到一个难题,我们需要验证它是否仍然有效。下面是该问题的突出错误signar在window.unload事件中向OnDisconnected发送一个ajax请求,通知服务器它中止了连接。如果此ajax请求是异步的,则它可能无法在文档卸载之前完成,或者根本无法由浏览器执行。这种行为似乎在不同的浏览器版本之间经常发生变化;我在Chrome和Firefox的不同版本中都看到过这种失败。在Signalr2.x中,脚本还尝试在onbeforeunload中停止连接;我不确定这是否完全解决了这个问题 如果所述ajax调用未完成,则默认情况下仅在30秒后调用OnDisconnected。您可以通过以下方式更改此设置:
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
您可以尝试修改signar脚本,使其在从window.unload中止时始终使用async:false,这可能会增加场景中完成调用的几率。但是,从window.unload执行同步调用也可能被浏览器视为不好的做法,因为它可能会阻止页面卸载。因此,浏览器可能决定不允许此类呼叫。我在自托管跨域设置中遇到了与SignalR 2.0-rc1相同的问题,到目前为止还没有找到好的解决方案。因此,最终看来,依靠立即呼叫OnDisconnected是不明智的
我注意到的一个问题是,如果使用jsonp:true启动集线器连接,即使关闭选项卡,它也不会通知服务器——在这种情况下,将ajax调用的数据类型设置为text至少是一个部分修复
我知道现在有一个更具权威性的答案,但我还是要发布这个
编辑:
在这里使用这个
window.onbeforeunload = function (e) {
$.connection.hub.stop();
};
实际上工作得很好。信号器在window.unload事件中向OnDisconnected发送一个ajax请求,通知服务器它中止了连接。如果此ajax请求是异步的,则它可能无法在文档卸载之前完成,或者根本无法由浏览器执行。这种行为似乎在不同的浏览器版本之间经常发生变化;我在Chrome和Firefox的不同版本中都看到过这种失败。在Signalr2.x中,脚本还尝试在onbeforeunload中停止连接;我不确定这是否完全解决了这个问题 如果所述ajax调用未完成,则默认情况下仅在30秒后调用OnDisconnected。您可以通过以下方式更改此设置:
GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30);
您可以尝试修改signar脚本,使其在从window.unload中止时始终使用async:false,这可能会增加场景中完成调用的几率。但是,从window.unload执行同步调用也可能被浏览器视为不好的做法,因为它可能会阻止页面卸载。因此,浏览器可能决定不允许此类呼叫。我在自托管跨域设置中遇到了与SignalR 2.0-rc1相同的问题,到目前为止还没有找到好的解决方案。因此,最终看来,依靠立即呼叫OnDisconnected是不明智的
我注意到的一个问题是,如果使用jsonp:true启动集线器连接,即使关闭选项卡,它也不会通知服务器——在这种情况下,将ajax调用的数据类型设置为text至少是一个部分修复
我知道现在有一个更具权威性的答案,但我还是要发布这个
编辑:
在这里使用这个
window.onbeforeunload = function (e) {
$.connection.hub.stop();
};
实际上,效果很好。目前我们只是忽略了它,但我会在回到项目的这一部分后尝试一下,谢谢:我也遇到了同样的问题。不幸的是,它在IE8上,需要jsonp。window.onbeforeunload对我也不起作用。您是说可以修改单个方法调用以使用async:false吗?你能提供更多的细节吗?@murrayju我的意思是你
可以使触发OnDisconnected同步的调用;您可以在jquery.signalr-*中有条件地这样做;相关方法的名称为ajaxAbort;然而,如果你可以用不同的设计来避免它,我不推荐这种方法。目前我们只是忽略它,但我会在回到项目的那一部分时尝试一下,谢谢你:我也有同样的问题。不幸的是,它在IE8上,需要jsonp。window.onbeforeunload对我也不起作用。您是说可以修改单个方法调用以使用async:false吗?你还可以提供更多的细节吗?@murrayju我的意思是你可以打电话触发OnDisconnected synchronous;您可以在jquery.signalr-*中有条件地这样做;相关方法的名称为ajaxAbort;但是,如果你能用不同的设计避免它,我不推荐这种方法。非常感谢链接dfowler:它现在在2.xx版下稳定吗?这是chrome中的一个bug。我们实际上没有修复任何东西。非常感谢链接dfowler:它现在在2.xx版下稳定吗?这是chrome中的一个bug。我们实际上什么都没修。