我有一个使用带有Angular的SignalR 2.1.1的队列系统。实际上一切都很完美。但是,当我决定针对IIS中断测试系统时,我注意到了一个问题。当我停止,然后启动IIS,IIS重启不会导致问题,我的javascript功能,集线器调用将不再触发。这对我来说很有意义,但问题是客户端仍然可以毫无问题地调用服务器,因此用户不知道它们已断开连接。这肯定会搞乱我的队列状态。
因此,解决方案似乎能够以某种方式测试此断开连接并在必要时重新连接。有没有办法测试客户端功能我的集线器呼叫是否仍然连接?似乎因为我可以调用集线器它应该重新连接,虽然我没有看到任何活动发生。我在客户端尝试了断开连接,重新连接,stateChanged事件,看看我是否能抓住这一点而没有运气。
感谢您的帮助
答案 0 :(得分:1)
所以我的解决方案是在集线器上创建一个只响应调用者的方法:
public void LastChange()
{
Clients.Caller.lastChange();
}
我在Angular控制器中将这个函数挂钩回来:
vm.queueHub.client.lastChange = function onLastChange()
{
vm.lastChangeCalledBack = true;
}
同样在我的控制器中,我创建了这个函数来测试lastChangeCalledBack变量,该变量由集线器调用的函数设置。如果在某些间隔测试后没有设置,我认为我们已经失去连接:
vm.stillAlive = function()
{
vm.queueHub.server.lastChange();
var found = $interval(function()
{
if (vm.lastChangeCalledBack == true)
{
vm.lastChangeCalledBack = false;
$interval.cancel(found);
}
}, 100, 10);
return found;
}
最后,我在我的控制器中创建了这个函数,并从任何从UI进行队列更改的函数调用它,并在连接仍然有效的情况下传入回调函数。出于某种原因,承诺似乎与Angular文档所说的相反,但我必须误解:$interval docs
function verifyConnection(callback)
{
vm.stillAlive().then(
function (data) {
console.log("Lost connection with server: " + data);
signalrFactory.start();
var reconnectedMessage = "There was a server disconnect. Your connection has been re-established, but you should reload your browser."
getQueue(function () { alert(reconnectedMessage); });
},
function (data) {
console.log("Server connection intact: " + data);
callback();
}
);
}
例如,这是从UI调用以打开模态:
vm.open = function (item)
{
verifyConnection(function () {
openFlagModal(item);
});
};
我还计划定期调用verifyConnection()函数。无论如何,这个解决方案似乎都能正常工作并使所有客户端与服务器保持同步。但是,我不喜欢SignalR客户端已经向服务器发送ping,和重新建立连接,而不是重新连接回调客户端方法。这让我想知道我是否做错了导致客户端功能无法重新连接。
对此解决方案的任何想法?