【问题标题】:SignalR Stops Working After A WhileSignalR 在一段时间后停止工作
【发布时间】:2015-03-11 02:58:56
【问题描述】:

由于某种原因,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 除外)是:

[15:18:58 GMT-0600 (CST)] SignalR:触发客户端集线器事件 集线器“AlertHub”上的“addAlert”。

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

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

我意识到一种解决方法是强制每 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 消息,但没有别的。

【问题讨论】:

  • 您是否在服务器端的集线器中设置了日志,以查看您的客户端是否在停止活动之前断开连接?
  • 我没有。我会这样做并发布结果。谢谢。
  • 除了日志。你使用什么交通工具,你正在通过代理吗?如果是这样,您是否尝试过使用 https?
  • 我正在使用 WebSockets。我没有通过代理,也没有尝试过 HTTPS,但会。
  • 这是否可能来自您的服务器,正在重置应用程序池?我自己没有经历过这种情况,但我知道 SignalR 不会使该连接保持活动状态(就重置应用程序池重置超时而言)。我认为默认情况下会话状态是 20 分钟(?),应用程序池是 90 分钟?我记不清了。我猜 - 也许看看服务器在做什么。应用程序池是否正在刷新,为每个人提供所有新连接?

标签: javascript asp.net signalr signalr-hub


【解决方案1】:

我认为信号器的默认超时时间为 110 秒。你可以尝试signalr disconnected事件重新连接它吗?

$.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?

【讨论】:

  • 我会试一试并发布结果。谢谢。
  • 110 秒超时仅用于长轮询请求,以防止代理中断长时间运行的 HTTP 请求。轮询请求将在 110 秒后关闭,并且将创建一个新的轮询请求,这不会导致重新连接/断开连接,因为这是轮询工作的时间。此超时不适用于其他传输(好的,我不确定永久帧传输)
  • 有什么进展吗?我现在很好奇。正如 Jason 所说,应用程序池回收是否会影响这一点。
  • 这并没有解决问题。应用程序池不会被回收,而是每 4 小时一次,所以它不会影响这一点。如果您有兴趣,请发布服务器日志。我不明白他们。
【解决方案2】:

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

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

【讨论】:

  • 你能把你做的代码/文件贴在哪里吗?我想我有同样的问题。非常感谢。
【解决方案3】:

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

【讨论】:

  • 这是一个技巧,不是解决方案
  • 对根本原因有任何想法吗?
  • @RandonBoy,你在为 SignalR 使用自定义依赖解析器吗?
  • 对于这个项目没有。您在哪里托管项目。它可能是 IIS 和会话。 ;)
猜你喜欢
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多