Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Chrome上使用服务器发送事件的信号器_C#_Javascript_Google Chrome_Signalr - Fatal编程技术网

C# 在Chrome上使用服务器发送事件的信号器

C# 在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上

我的问题是:

我在Chrome上运行我的代码,注意到SignalR使用html5服务器发送事件作为自动选择,很好。然而,当我刷新页面时,服务器端的onDisconnect直到30秒后才启动。集线器中是否有任何设置可以使其在断开连接事件时立即响应

我的观察:

请注意,延迟问题仅发生在刷新页面时,而不是在关闭浏览器时。关闭浏览器时,onDisconnect会立即启动。怪事@_@

版本限制:

我使用的是2.x.x之前的最新版本SignalR 1.1.3,因为我们公司没有vs2013,我无法在我的pc上使用vs2013 express


请帮助:

这是一个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。我们实际上什么都没修。