SignalR-Hub在IIS停止后,启动将不再调用客户端函数

SignalR-Hub after IIS stop,start will no longer call client functions

本文关键字:不再 调用 客户端 函数 启动 IIS SignalR-Hub      更新时间:2023-09-26

我有一个使用SignalR 2.1.1和Angular的队列系统。实际上一切都很顺利。但是,当我决定针对IIS中断测试系统时,我注意到一个问题。当我停止,然后启动IIS, IIS重启不会导致问题,我的javascript函数,集线器调用将不再触发。这对我来说是有意义的,但问题是客户端仍然可以在没有任何问题的情况下调用服务器,因此用户不知道他们已断开连接。这肯定会弄乱我的队列状态。

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

感谢您的帮助

所以我的解决方案是在集线器上创建一个只响应调用者的方法:

    public void LastChange()
    {
        Clients.Caller.lastChange();
    }

我把这个调用钩回了我的Angular控制器中的这个函数:

    vm.queueHub.client.lastChange = function onLastChange()
    {
        vm.lastChangeCalledBack = true;
    }

还在我的控制器中创建了这个函数,该函数测试由hub调用的函数设置的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文档中所说的相反,但我一定是误解了:

    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, 重新建立连接,只是没有重新连接回调客户端方法的事实。这让我怀疑我是否做错了什么,导致客户端函数不能重新连接。

对这个解决方案有什么想法吗?