SignalR 在一段时间后停止工作
SignalR Stops Working After A While
出于某种原因,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: Triggering client hub event
'addAlert' on hub 'AlertHub'.
其中许多事件会在短时间内进入,然后就停止,即使服务器应该仍在发送它们。
我在 Mac 和 SignalR 2.0.0 上使用 Firefox 35.0.1。
我知道一个解决方法是强制每 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
消息,但没有其他消息。
如果客户端处于非活动状态,没有鼠标移动(大约每 15-30 分钟),您可以刷新页面。我遇到了同样的问题并以这种方式解决了。这是一个糟糕的解决方法,但后来我忘记了它并且从未完全修复它;)
我认为信号器的默认超时为 110 秒。你能试试 signalr disconnected event 来重新连接吗?
$.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?
事实证明,问题出在我处理 AlertHub
连接的方式上。我正在使用企业库缓存来存储支持 AlertHub
的连接,并且我在创建缓存条目 20 分钟后使它们过期。因此,当服务器调用客户端方法时,没有报告错误,因为没有客户端可以将消息发送到。
我已经将缓存过期时间增加到一个合理的值,这解决了问题。
出于某种原因,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: Triggering client hub event 'addAlert' on hub 'AlertHub'.
其中许多事件会在短时间内进入,然后就停止,即使服务器应该仍在发送它们。
我在 Mac 和 SignalR 2.0.0 上使用 Firefox 35.0.1。
我知道一个解决方法是强制每 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
消息,但没有其他消息。
如果客户端处于非活动状态,没有鼠标移动(大约每 15-30 分钟),您可以刷新页面。我遇到了同样的问题并以这种方式解决了。这是一个糟糕的解决方法,但后来我忘记了它并且从未完全修复它;)
我认为信号器的默认超时为 110 秒。你能试试 signalr disconnected event 来重新连接吗?
$.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?
事实证明,问题出在我处理 AlertHub
连接的方式上。我正在使用企业库缓存来存储支持 AlertHub
的连接,并且我在创建缓存条目 20 分钟后使它们过期。因此,当服务器调用客户端方法时,没有报告错误,因为没有客户端可以将消息发送到。
我已经将缓存过期时间增加到一个合理的值,这解决了问题。