2013-02-27 309 views
1

我的(JavaScript的)轮毂客户的理解是,如果一个连接丢失时,它进入其中尝试重新连接一个“重新连接...”相。如果不能这样做,它将进入“断开”状态,这是它将停留的位置,直到要求重新开始。客户端重新连接

多久“重新连接......”阶段意味着持续它放弃过吗?我已经阅读了40秒之前,但我的客户似乎需要更少的时间 - 大约10,或许更少。 [编辑:没关系这一部分,我已经在服务器上配置一个10断开作为测试...忘。我知道这是在谈判期间由服务器设置的。说得通!] ...我宁愿让客户端不断地重试,直到它被告知中止 - 可以这样做,它会导致问题?

另一个问题;在重新连接...阶段期间,如果我尝试调用集线器方法(再次,在JS中)它似乎从未完成。我使用返回的Deferred来检查“完成”和“失败”事件,但似乎都没有被调用。这是设计吗?

谢谢。

回答

2

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

处理客户端上的断开事件,并呼吁connection.start:

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

唯一的问题,这将导致的是,你可能被触发无限的请求是不是有客户机服务器。当你将移动市场引入这种情况时,这会变得更加麻烦(疯狂地消耗电池)。

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

希望这会有所帮助!

+1

第一次修复是一个引人内存泄漏的好方法。 – davidfowl 2013-02-28 06:03:21

+0

@davidfowl要断开连接的JavaScript重新连接?究竟会导致内存泄漏? – 2015-04-08 18:29:45

+1

@FireLizzard查看帖子的历史记录http://stackoverflow.com/posts/15125363/revisions – davidfowl 2015-04-09 09:05:27

0

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

Signalr客户端重新连接到新的过程,而长期运行的任务是在旧的进程中运行,所以当在长时间运行的任务,你做

GlobalHost.ConnectionManager.GetHubContext<ForceHub>();

你实际上得到一个参考的“老”集线器,而客户端连接到“新”集线器。 这就是为什么由Wasp执行测试的原因:他发出了一个新的请求,在新创建的工作进程中处理的信号中心上发布。

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

如果出现这种问题,即使没有底板,由新请求生成的通知也可以正常工作。请注意,背板的真正目的是扩展信号发生器,即在它们之间连接一个WebServers场。

另外请记住,在IIS内部运行长时间运行的任务非常难以实现,因为IIS会定期执行appPool回收操作并对请求执行超时限制。我建议你阅读以下文章:http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx “如果你认为自己可以写一个背景任务,那很可能你会错误的。我不是在质疑你的技能,我只是说它很微妙。另外,你为什么要?“

希望这可以帮助