SignalR运行一段时间后停止工作

7

由于某些原因,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:在hub“AlertHub”上触发客户端hub事件'addAlert'。

这些事件中的许多事件会短暂出现,然后就会停止,即使服务器仍应该发送它们。
我正在使用Mac上的Firefox 35.0.1和SignalR 2.0.0。
我意识到一个解决方法是每10分钟左右强制刷新页面,但我正在寻找一种修复问题根本原因的方法。
我在服务器上启用了SignalR跟踪。在刷新Alert页面后,我在服务器上创建了一个“警报”,并且警报通过了。我等了大约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 消息。


1
你在服务器端的中心设置了日志,以查看客户端是否在停止活动之前断开连接了吗? - Steve Mitcham
我还没有。我会去做并发布结果。谢谢。 - Swisher Sweet
除了日志之外。您使用了哪种传输方式并且是否通过代理?如果是,是否尝试使用HTTPS? - Pawel
我正在使用WebSockets。我没有经过代理,也没有尝试过HTTPS,但会尝试。 - Swisher Sweet
2
这可能是来自您的服务器,重置应用程序池吗?我自己没有遇到过这种情况,但我知道SignalR不会保持连接活动(在重置应用程序池超时方面)。我想默认情况下会话状态为20分钟(?),应用程序池为90分钟?我记不清了。我猜-也许看看服务器正在做什么。应用程序池是否正在刷新,给所有人提供全新的连接? - Jason
应用程序池正在刷新,但仅每4小时进行一次。我估计客户端在页面刷新后大约15分钟停止被调用。 - Swisher Sweet
3个回答

2

我会尝试并发布结果。谢谢。 - Swisher Sweet
1
110秒的超时时间仅用于长轮询请求,以防止代理中断长时间运行的HTTP请求。在110秒后,轮询请求将被关闭,并创建一个新的轮询请求,这不应该导致重新连接/断开连接,因为这就是长轮询的工作方式。此超时时间不适用于其他传输方式(好吧,我不确定永久帧传输是否适用)。 - Pawel
有进展吗?我现在很好奇。应用程序池的回收是否会像Jason所说的那样影响它? - Chaitanya Gadkari
这并没有解决问题。应用程序池每4小时才会回收,因此不会影响到这个问题。如果您感兴趣,我已经发布了服务器日志。但我并不理解它们。 - Swisher Sweet

0
事实证明,问题出在我处理AlertHub连接的方式上。我使用企业库缓存来存储支持AlertHub的连接,并在创建后20分钟后过期缓存条目。因此,当服务器调用客户端方法时,没有报告任何错误,因为没有客户端可发送消息。
我已经将缓存过期时间增加到合理值,这解决了问题。

你能发一下你写那个的代码/文件吗?我觉得我遇到了同样的问题。非常感谢。 - toddmo

-3

如果客户端不活动,没有鼠标移动(大约每15-30分钟),您可以刷新页面。我曾遇到同样的问题,用这种方法解决了它。那是一个讨厌的解决办法,但后来我忘记了它,并没有完全修复它;)


3
那只是一个技巧,而不是解决方案。 - Anders
有关根本原因的任何想法? - Swisher Sweet
@RandonBoy,你是否在使用自定义依赖项解析器来处理SignalR? - Swisher Sweet
对于这个项目,你们使用哪个主机进行托管?可能是IIS和sessions。;) - RandomBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接