SignalR在一段时间后停止工作

时间:2015-02-23 21:36:31

标签: javascript asp.net signalr signalr-hub

出于某种原因,SignalR将在短时间内(我估计大约1小时或更短时间)停止调用客户端方法。我有一个显示警报的页面......一个非常简单的实现。这是Javascript:

$(function () {

    // enable logging for debugging
    $.connection.hub.logging = true;

    // Declare a proxy to reference the hub. 
    var hub = $.connection.alertHub;

    hub.client.addAlert = function (id, title, url, dateTime) {
        console.log(title);
    };

    $.connection.hub.start().done(function () {
        console.log("Alert Ready");
    });
});

如果我刷新页面,它会再次运行大约一个小时,然后将停止调用客户端事件addAlert。日志中没有错误,没有警告。日志中的最后一个事件(除了ping到服务器)是:

  

[GMT-0600(CST)15:18:58] SignalR:触发客户端集线器事件   ' addAlert'在hub' AlertHub'。

这些事件中的许多事件会在短时间内进入,然后停止,即使服务器仍应发送它们。

我在Mac和SignalR 2.0.0上使用Firefox 35.0.1。

我意识到解决方法是每10分钟左右强制页面刷新一次,但我正在寻找解决问题根本原因的方法。

我在服务器上启用了SignalR跟踪。我创建了一个"警报"在重新刷新警报页面并且警报通过后,在服务器上。我等了大约10分钟,我再次尝试了,但未能通过。这是日志读取的内容(对于详细程度而言,不确定相关内容):

SignalR.Transports.TransportHeartBeat Information: 0 : Connection b8b21c4c-22b4-4686-9098-cb72c904d4c9 is New.
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(b8b21c4c-22b4-4686-9098-cb72c904d4c9)

还有数十封SignalR.Transports.TransportHeartBeat条消息,但没有别的消息。

3 个答案:

答案 0 :(得分:1)

我认为信号灯的默认超时为110秒。你可以尝试使用信号器断开连接的事件来重新连接它。

$.connection.hub.disconnected(function () {
            setTimeout(function () {
                startHub();
            }, 5000);
        });

并在startHub()中,您可以再次开始连接。

参考:https://github.com/SignalR/SignalR/issues/3128

How to use SignalR events to keep connection alive in the right way?

答案 1 :(得分:0)

事实证明问题是我处理AlertHub连接的方式。我正在使用企业库缓存来存储支持AlertHub的连接,并且我在创建缓存条目20分钟后使其到期。 Ergo,当服务器调用客户端方法时,没有报告错误,因为没有客户端发送消息。

我已经将缓存过期时间增加到合理的值,从而解决了这个问题。

答案 2 :(得分:-2)

如果客户端处于非活动状态,没有鼠标移动(大约每15-30分钟),您可以刷新页面。我有同样的问题并以这种方式解决了。这是令人讨厌的解决方法,但后来我忘记了它并且从未完全修复它;)