一段时间后 SignalR 停止工作

Swi*_*eet 7 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");
    });
});
Run Code Online (Sandbox Code Playgroud)

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

[15:18:58 GMT-0600 (CST)] SignalR:在中心“AlertHub”上触发客户端中心事件“addAlert”。

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

我在 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)
Run Code Online (Sandbox Code Playgroud)

还有几十条SignalR.Transports.TransportHeartBeat消息,但没有其他消息。

Swi*_*eet 0

事实证明,问题出在我处理AlertHub连接的方式上。我正在使用 Enterprise Library Caching 来存储支持 的连接AlertHub,并且缓存条目在创建 20 分钟后就会过期。因此,当服务器调用客户端方法时,不会报告任何错误,因为没有客户端可以向其发送消息。

此后我将缓存过期时间增加到一个合理的值,这解决了问题。