【问题标题】:SignalR-Hub after IIS stop,start will no longer call client functionsIIS停止后SignalR-Hub,启动将不再调用客户端函数
【发布时间】:2014-08-22 00:31:01
【问题描述】:

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

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

感谢您的帮助

【问题讨论】:

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


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

    对此解决方案有何想法?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 2018-03-02
      相关资源
      最近更新 更多