客户端重新连接

时间:2013-02-27 23:37:26

标签: signalr

我对(JavaScript)集线器客户端的理解是,如果连接丢失,它会进入“重新连接...”阶段,尝试重新连接。如果它不能这样做,它将进入“断开连接”状态,直到被要求重新开始它才会停留。

'重新连接......'阶段在它放弃之前意味着持续多长时间?我之前读过40秒,但我的客户似乎花了不少时间 - 大约10,可能更少。 [编辑:没关系这部分,我在服务器上配置了10个断开连接作为测试......忘了我理解这是由协商期间服务器设置的。有道理!] ...我更愿意让客户端不断重试,直到它被告知中止 - 这可以完成,并且会导致问题吗?

另一个问题;在Reconnecting ...阶段,如果我试图调用hub方法(再次,在JS中)它似乎永远不会完成。我正在使用返回的Deferred检查“完成”和“失败”事件,但似乎都没有被调用。这是设计的吗?

感谢。

2 个答案:

答案 0 :(得分:2)

你绝对可以不断重新连接。

处理客户端上的已断开事件并调用connection.start:

$.connection.hub.disconnected(function() {
   setTimeout(function() {
       $.connection.hub.start();
   }, 5000); // Re-start connection after 5 seconds
});

这会导致唯一的问题是您可能会触发对客户端计算机不存在的服务器的无限请求。当你将移动市场引入这种情况时,这会变得更加麻烦(像疯了一样耗尽电池)。

当您尝试在重新连接SignalR时尝试呼叫集线器方法时,将尝试发送您的命令。由于有2个通道,一个用于接收数据,一个用于发送(对于除Web套接字之外的所有传输),在某些情况下,仍然可以在离线时发送请求。因此,在浏览器告知它无法成功发出请求之前,SignalR不知道请求是否失败。

希望这有帮助!

答案 1 :(得分:0)

我可能有一个线索......触摸Web.config会产生一个appPool Recycle,这意味着将为新请求创建一个新的工作进程,而现有进程将持续一段时间,直到剩余的请求结束或超时到达了。未终止超时期限的请求将被终止。

Signalr客户端在旧进程中运行长时间运行的任务时重新连接到新进程,因此在执行长时间运行的任务时

GlobalHost.ConnectionManager.GetHubContext<ForceHub>();

当客户端连接到“新”集线器时,您实际上获得了“旧”集线器的引用。 这就是为什么Wasp执行的测试工作的原因:他正在新的请求发布在新创建的工作进程中处理的信号器中心。

您可以尝试配置singalr背板(https://www.asp.net/signalr/overview/performance/scaleout-in-signalr),使用Sql Server(https://www.asp.net/signalr/overview/performance/scaleout-with-sql-server)配置它非常容易。背板应该能够连接两个工作进程,希望您能在客户端获得通知。

如果出现此问题,即使没有背板,新请求生成的通知也会有效。请注意,背板的真正目的是扩展信号器,即连接它们之间的Web服务器场。

另外请记住,在IIS中运行长时间运行的任务很难实现,因为IIS会定期执行appPool循环并且对执行请求有超时限制。我建议您阅读以下帖子:http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx “如果你认为自己可以自己写一个后台任务,那么你很可能会错。我并没有贬低你的技能,我只是说它很微妙。另外,你为什么要这么做?“

希望这有帮助