【问题标题】:Client Reconnection客户端重新连接
【发布时间】:2013-02-27 23:37:26
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: signalr


    【解决方案1】:

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

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

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

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

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

    希望这会有所帮助!

    【讨论】:

    • 第一个修复方法是引入内存泄漏的绝佳方式。
    • @davidfowl 断开连接时重新连接的javascript?这到底怎么会导致内存泄漏?
    • @FireLizzard 看帖子历史stackoverflow.com/posts/15125363/revisions
    • 记得在客户端重新加入您已经加入的任何群组。
    【解决方案2】:

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

    当长时间运行的任务在旧进程中运行时,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) 配置它真的很容易。背板应该能够连接两个工作进程,希望您能在客户端收到通知。

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

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多