所以我的解决方案是在集线器上创建一个只响应调用者的方法:
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,并重新建立连接,而不是重新连接回调客户端方法的事实。这让我想知道我是否做错了什么导致客户端功能无法重新连接。
对此解决方案有何想法?