Signalr - 无穷无尽的 $.connection.hub.disconnected 事件?

Signalr - endless $.connection.hub.disconnected event?

我正在使用 Signalr 2.2.1 成功连接 websocket。

以下是不同州的事件:(为简洁起见进行了简化)

var hub = $.connection.moveShapeHub;


$.connection.hub.start().done(function ()
{
    console.log("hub started successfully");

}).fail(function () { console.log('Could not Connect!'); });


$.connection.hub.disconnected(function ()
{
    $.connection.hub.start();
    console.log('Connection disconnected')
});

我的应用程序运行正常。

但是看看当我 禁用 网卡时会发生什么 ( 我访问我的计算机不是通过本地主机而是通过动态 dns 进入世界然后回到我的电脑)

一开始可以看到websocket连接错误(我多次看到)

WebSocket connection to 'ws://xxxxxx.ddns.net/signalr/reconnect?transport=webSockets&messageId=d-C68A95E5-g%2C1&clientProtocol=1.5&connectionToken=%2FDJL8eAtVtSA3XKeap4Js3IrbkCm56C%2FWKCQtApGiMroWAgnzNoRHmJ0Y2LpIdWWWL%2BfY3dXvJqYHFfby1XYii0ibPpKM55PQuZyf9aH4k9JHIT79lWoMWBasIpa9Gjk&connectionData=%5B%5D&tid=2' failed: Error in connection establishment: net::ERR_INTERNET_DISCONNECTED

然后你看到 无休止的电话(!!!) 谈判

http://xxxx.ddns.net/signalr/negotiate?clientProtocol=1.5&connectionToken=%2FDJL8eAtVtSA3XKeap4Js3IrbkCm56C%2FWKCQtApGiMroWAgnzNoRHmJ0Y2LpIdWWWL%2BfY3dXvJqYHFfby1XYii0ibPpKM55PQuZyf9aH4k9JHIT79lWoMWBasIpa9Gjk&connectionData=%5B%7B%22name%22%3A%22moveshapehub%22%7D%5D&_=1485811277855

等待 ~15 秒以查看无限循环:

问题

如何解决那些没完没了的电话?或者 alternatvly - 增加那些 "negotiate calls" 的延迟 - 比如说每 2 秒一次(而不是无休止地快速燃烧 0.1 秒)

编辑

我已经更改了这段代码:

$.connection.hub.disconnected(function ()
    {
        $.connection.hub.start();
        console.log('Connection disconnected')
    });

到此(删除集线器开始):

$.connection.hub.disconnected(function ()
    {
             console.log('Connection disconnected')
    });

现在我只看到这条消息:

但现在我失去了 "trying restart connecting" 的所有基本概念,以防断开连接。所以我再次问是否有任何合理的解决方案或至少尝试 "restart the connection every 2 seconds" ?

negotiate 是 SignalR 客户端发送的第一个建立连接的请求。您正在尝试在 disconnected 事件处理程序中断开连接后立即启动连接。由于网络已关闭 negotiate 失败并调用了 disconnected 事件,您尝试再次启动连接。 documentation 展示了如何处理超时:

$.connection.hub.disconnected(function() {
   setTimeout(function() {
       $.connection.hub.start();
   }, 5000); // Restart connection after 5 seconds.
});

所有 SR 连接问题的答案是检查并保持每个服务器请求的连接状态。我创建了一个将代理方法作为参数并在建立集线器连接可用后触发代理方法的方法。

调用方法使用 SR_Connection.execute。

建立连接后提交请求的执行。

function cancel(){
    SR_Connection.execute('SRProxy.server.Cancel', uniqueID);
}

var SR_Connection = (function () {
    //Start of the Return Statement
    return {
        execute: function (method, params) {
            if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
                $.connection.hub.start().done(function () {
                    SR_Connection.commit(method, params);
                });
            }
            else {
                SR_Connection.commit(method, params);
            }
        },
        commit: function (method, params) {
            var namespaces = method.split("."),
                context;

            if (typeof (window) == "undefined") {
                context = global;
            } else {
                context = window;
            }

            var functionToExecute = namespaces.pop();

            for (var i = 0; i < namespaces.length; i++) {
                context = context[namespaces[i]];
            }

            context[functionToExecute](params);
        }
    };//End of the Return Statement
})();