Firefox中的Signal R Disonnect延迟

时间:2016-06-10 15:12:50

标签: javascript c# signalr

我注意到在Firefox中,来自Signal R中心的断开事件被延迟了。我很确定这是因为没有收到客户端的断开事件,而是服务器超时。如果我调试我的disconnect事件,则stopCalled参数始终为false。

我试图在beforeunload事件中从我的JavaScript手动调用stop事件,但这并没有任何效果。我已经读过Firefox出于安全原因不允许在unload事件中发生同步事件,所以它可能会阻止调用吗?

CS

public class WebHub : Hub
{
    public override Task OnDisconnected(bool stopCalled) { }
}

JS

$.connection.webHub.start().done();
$(window).bind('beforeunload', function() {
    $.connection.hub.stop();
});

如果我在Firefox控制台中调用stop方法,它会立即触发断开事件。

更新1

启用SignalR JS日志记录后,看起来断开连接正在客户端发生,它只是没有命中服务器。

//navigated page, connection ends

SignalR: Stopping connection." jquery.signalR-2.2.0.js:81:17
SignalR: EventSource calling close()." jquery.signalR-2.2.0.js:81:17
SignalR: Fired ajax abort async = true." jquery.signalR-2.2.0.js:81:17
SignalR: Stopping the monitoring of the keep alive." jquery.signalR-2.2.0.js:81:17
SignalR: Window unloading, stopping the connection." jquery.signalR-2.2.0.js:81:17

//next page load begins

SignalR: Client subscribed to hub 'webhub'." jquery.signalR-2.2.0.js:81:17
SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.5 jquery.signalR-2.2.0.js:81:17
SignalR: serverSentEvents transport starting." jquery.signalR-2.2.0.js:81:17
SignalR: Attempting to connect to SSE endpoint 'http://website.co.uk/signalr/connect?transport=serverSentEvents&clientProtocol=1.5 jquery.signalR-2.2.0.js:81:17
SignalR: EventSource connected." jquery.signalR-2.2.0.js:81:17
SignalR: serverSentEvents transport connected. Initiating start request." jquery.signalR-2.2.0.js:81:17
SignalR: The start request succeeded. Transitioning to the connected state." jquery.signalR-2.2.0.js:81:17
SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000" jquery.signalR-2.2.0.js:81:17

2 个答案:

答案 0 :(得分:1)

我在使用 FireFox 86 时遇到了同样的问题。花了将近 2-3 天,但没有找到任何具体的解决方案。这是一种对我有用的解决方法。当我的浏览器是 Firefox 并且它可以工作时,我只是忽略了 $.connection.hub.stop()。

$.connection.webHub.start().done();
$(window).bind('beforeunload', function() {
    if (navigator.userAgent.indexOf("Firefox") == -1) {
            $.connection.hub.stop();
        }
});

答案 1 :(得分:0)

通过删除beforeunload事件绑定解决了问题。我最初添加了这个,因为它在IE中解决了类似的问题。我现在已将此更改为仅在IE中运行。

所以问题中的JS只会变成: -

$.connection.webHub.start().done();