1

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

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

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

谢谢。

4

2 回答 2

2

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

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

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

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

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

希望这可以帮助!

于 2013-02-28T00:35:19.360 回答
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 )。背板应该能够连接两个工作进程,希望您能在客户端收到通知。

如果这是问题所在,即使没有背板,新请求生成的通知也会起作用。请注意,背板的真正目的是扩展信号器,即在它们之间连接一组 WebServer。

还要记住,在 IIS 中运行长时间运行的任务是难以实现的任务,除其他外,IIS 会定期执行 appPool 回收,并且对执行请求有超时限制。我建议您阅读以下帖子:http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx “如果您认为自己可以编写后台任务,那么您很可能会弄错。我不是在指责你的技能,我只是说它很微妙。另外,你为什么必须这样做?”</p>

希望这可以帮助

于 2017-01-12T11:40:35.530 回答