信号器 - 无休止的$ .connection.hub.disconnected事件?

时间:2017-01-30 21:29:55

标签: asp.net signalr .net-4.6

我使用Signalr 2.2.1并成功完成了websocket连接。

enter image description here

以下是不同州的事件:(为简洁而简化)

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')
});

我的应用正常运作正常。

但看看当我禁用网卡时会发生什么(我不是通过localhost访问我的电脑,而是通过动态dns访问世界,然后返回我的电脑)

首先你可以看到websocket连接错误(我多次看到它)

  

WebSocket连接到   ' WS://xxxxxx.ddns.net/signalr/reconnect运输=&的WebSockets放大器; MESSAGEID = d-C68A95E5-G%2C1&安培; clientProtocol = 1.5&安培; connectionToken =%2FDJL8eAtVtSA3XKeap4Js3IrbkCm56C%2FWKCQtApGiMroWAgnzNoRHmJ0Y2LpIdWWWL%2BfY3dXvJqYHFfby1XYii0ibPpKM55PQuZyf9aH4k9JHIT79lWoMWBasIpa9Gjk&安培; connectionData =%5B %5D&安培; TID = 2'   f ailed:连接建立错误:   净:: 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 秒才能看到无限循环:

enter image description here

问题

如何解决这些无休止的通话?或者替代地 - 增加那些"协商呼叫的延迟" - 每2秒钟一次(而不是无休止地快速燃烧0.1秒)

修改

我已更改此代码:

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

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

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

现在我只看到这条消息:

enter image description here

但现在我失去了所有基本想法"尝试重启连接"如果断开连接。所以我再问一下是否有任何合理的解决方案,或至少尝试"每2秒重启一次连接" ?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

使用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
})();