2015-02-23 85 views
2

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

$(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。日志中没有错误,没有警告。在日志中的最后一个事件(比坪到服务器的其他)为:

[15点十八分58秒GMT-0600(CST)] SignalR:在轮毂触发客户机毂事件 'addAlert' '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的消息,但没有别的。

+1

您是否在服务器端的集线器中设置了日志,以查看客户端在停止的活动之前是否断开连接? – 2015-02-24 13:37:16

+0

我没有。我会这样做并发布结果。谢谢。 – 2015-02-24 13:51:29

+0

除了日志。你使用什么交通工具?你是否在经历代理?如果是这样,你有没有尝试过使用https? – Pawel 2015-02-24 18:22:42

回答

0

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

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

+0

你可以发布你的代码/文件吗?我想我有同样的问题。多谢。 – toddmo 2015-04-11 22:40:19

0

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

+0

这是一个破解不是一个解决方案 – Anders 2015-02-24 10:06:32

+0

任何想法的根本原因? – 2015-02-24 11:43:39

+0

@RandonBoy,您是否使用SignalR的自定义依赖解析器? – 2015-02-26 22:31:28

0

我认为theres信号的默认110秒超时。你可以尝试signalr断开的事件重新连接回来。

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

+0

我会给你一个镜头并发布结果。谢谢。 – 2015-02-24 13:56:57

+1

110秒超时仅用于长轮询请求,以防止代理破坏长时间运行的HTTP请求。轮询请求将在110秒后关闭,并且将创建一个新的轮询请求,这不会导致重新连接/断开连接,因为这是轮询的工作时间。此超时不适用于其他传输(好吧,我不知道永远帧传输) – Pawel 2015-02-24 18:21:27

+0

任何进展?我现在很好奇。正如贾森所说的那样,应用程序池回收会影响到这一点 – 2015-02-26 05:22:12

相关问题