我使用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')
});
我的应用正常运作正常。
但看看当我禁用网卡时会发生什么(我不是通过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
然后你会看到无休止的电话(!!!)到谈判
等待〜15 秒才能看到无限循环:
问题
如何解决这些无休止的通话?或者替代地 - 增加那些"协商呼叫的延迟" - 每2秒钟一次(而不是无休止地快速燃烧0.1秒)
修改
我已更改此代码:
$.connection.hub.disconnected(function ()
{
$.connection.hub.start();
console.log('Connection disconnected')
});
到此(删除集线器开始):
$.connection.hub.disconnected(function ()
{
console.log('Connection disconnected')
});
现在我只看到这条消息:
但现在我失去了所有基本想法"尝试重启连接"如果断开连接。所以我再问一下是否有任何合理的解决方案,或至少尝试"每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
})();