IIS停止后,SignalR-Hub将不再调用客户端功能

时间:2014-08-22 00:31:01

标签: javascript asp.net angularjs iis signalr-hub

我有一个使用带有Angular的SignalR 2.1.1的队列系统。实际上一切都很完美。但是,当我决定针对IIS中断测试系统时,我注意到了一个问题。当我停止,然后启动IIS,IIS重启不会导致问题,我的javascript功能,集线器调用将不再触发。这对我来说很有意义,但问题是客户端仍然可以毫无问题地调用服务器,因此用户不知道它们已断开连接。这肯定会搞乱我的队列状态。

因此,解决方案似乎能够以某种方式测试此断开连接并在必要时重新连接。有没有办法测试客户端功能我的集线器呼叫是否仍然连接?似乎因为我可以调用集线器它应该重新连接,虽然我没有看到任何活动发生。我在客户端尝试了断开连接,重新连接,stateChanged事件,看看我是否能抓住这一点而没有运气。

感谢您的帮助

1 个答案:

答案 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,重新建立连接,而不是重新连接回调客户端方法。这让我想知道我是否做错了导致客户端功能无法重新连接。

对此解决方案的任何想法?