【问题标题】:SignalR Timeout PropertiesSignalR 超时属性
【发布时间】:2013-03-22 01:34:24
【问题描述】:

我们遇到了这个链接,它指定了不同的超时属性: https://github.com/SignalR/SignalR/wiki/Configuring-SignalR

还有这篇出色的帖子 (When does a reconnect in signalR occour?),介绍了 SignalR 客户端和 SignalR 服务器之间如何断开和重新连接。

只是从上面的帖子中重新迭代不同的情况:

“当客户端脱机然后很快重新连接时会发生集线器重新连接。SignalR 配置值在很大程度上决定了以下示例的时间戳,因此不要逐字记录时间。

以下是涉及重新连接行为的几个示例及其结果(时间格式 m:ss):

情况1

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于 ISP 问题而失去连接(并意识到它失去了连接)

0:15 - 客户端重新连接

0:16 - 触发 OnReconnected 事件

情况2

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于拉动以太网电缆而失去连接(没有意识到它已断开连接)

0:15 - 客户端重新连接

这里可能会发生两件事

A: 0:16 - 没有任何反应,客户端继续之前的连接

B: 0:~45 - 客户端意识到它的断开连接*

B: 0:46 - 客户端转换到重新连接状态

B: 0:47 - 客户端成功重新连接并触发 OnReconnected 事件。

情况 3

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于拉动以太网电缆而失去连接(没有意识到它已断开连接)

0:~45 - 客户端意识到它的断开连接 *

0:46 - 客户端转换到重新连接状态

1:15 - 服务器确定客户端已经离开太久然后忘记了它,排队等待客户端接收的“断开连接”命令,如果它稍后重新连接。 ***

1:15 - OnDisconnect 被触发 1:16 - 客户端重新连接

1:17 - 客户端执行“软”重新连接(不触发 OnReconnected)

1:18 - 客户端检索“断开连接”命令

1:19 - 客户端调用“停止”并进行软断开(不触发 OnDisconnected)

情况4

0:00 - 客户端连接到服务器,触发 OnConnected

0:10 - 客户端由于拉动以太网电缆而失去连接(没有意识到它已断开连接)

0:~45 - 客户端意识到它的断开连接 *

0:46 - 客户端转换到重新连接状态

1:15 - 服务器确定客户端已经离开太久然后忘记了它,排队等待客户端接收的“断开连接”命令,如果它稍后重新连接。 ***

1:15 - OnDisconnect 被触发 1:30 - 客户端停止尝试重新连接(尝试时间过长)**

1:30 - 客户端转换为断开连接状态

  • 由于客户端保持活动检查:用于确定客户端何时由于缺乏保持活动而离线。不用于长轮询传输

** 由于客户端断开连接超时:用于确定客户端重新连接的时间过长,服务器可能在此期间忘记了客户端

*** 由于服务器断开连接超时:用于确定何时应该忘记客户端。这是一个时间跨度,一旦连接在服务器上被标记为死,就会开始累积。最终,服务器为客户端的主题排队一个断开命令,告诉客户端(如果它重新连接)它需要开始一个新的连接。清理主题后,该命令将从服务器中消失。”


我们发现,我们经常在 .NET SignalR 客户端和 ASP.NET MVC SignalR 服务器之间断开连接和重新连接(上面的 1 和 2),并且断开连接不会导致重新连接(3 和 4以上)。我们知道正在使用 ServerSentEvents 协议。

很难知道我们需要调整(增加或减少)哪些超时属性:

  1. 减少断开连接和重新连接的次数。
  2. 根本不会出现在情况 3 和 4 中。

这里要注意的重要一点是,我们的 .NET SignalR 客户端实际上是一个始终连接到服务器的 Windows 服务。

我们目前只保留默认设置,即:

  • ConnectionTimeout = 110 秒
  • DisconnectTimeout = 30 秒
  • KeepAlive = 30 秒

另外,我们使用的是 SignalR 1.0.1。

【问题讨论】:

    标签: signalr signalr-hub signalr.client


    【解决方案1】:

    .NET 客户端确实没有有这种行为。如果客户端突然断开连接,它将不会重新连接。它将在 1.1 中。

    【讨论】:

    • 我很困惑为什么人们对这个答案投了反对票,尤其是当 dfowler 实际上写了这个问题所涉及的框架时......
    • @david 似乎在 2.2 中也找不到这个功能,有什么更新吗?
    • 我正在使用 .NET 客户端和 JavaScript 客户端对此进行测试,并且重新连接似乎对两者都有效。使用 2.3.0。
    【解决方案2】:

    您的超时设置正确。在当前版本中,.net 客户端没有客户端保持活动状态,以确保客户端保持连接。

    在下一个版本中,您将拥有一个 .net 客户端保持活动状态。如果您愿意使用该项目的开发版本,该功能目前在开发分支 https://github.com/SignalR/SignalR/tree/dev 上可用。

    也供参考,这里是与您所看到的 https://github.com/SignalR/SignalR/issues/741 相关的问题。

    【讨论】:

    • 谢谢。这给了我们一些可以使用的东西。 PS。会投票,但我显然没有足够的代表点:-(一旦我确认客户端 Keep Alive 帮助我们解决断开连接,我会立即将此标记为答案。
    • 您好,我实际上在 dev 分支中找不到 .NET 客户端 KeepAlive。它似乎不是 Connection 类的属性。我能找到的最接近的是 IConnection 接口上具有超时属性的 KeepAliveData。我想这就是我们所指的?
    • 它使用心跳监视器,有关更多详细信息,您可以深入问题 #741 以查看与保持活动相关的提交。
    • 必须获得 DEV 版本并使用它。这似乎解决了我们遇到的连接问题。还设置了服务器端超时:DisconnectTimeOut = 200 秒,KeepAlive = 60 秒。
    【解决方案3】:

    您使用的是 SignalR 1.0.1 吗? Taylor 对重新连接过程的描述适用于 SignalR 版本 >= 1.0 和 JS 客户端。我问的原因是因为在 SignalR >= 1.0 中,KeepAlive 必须不超过DisconnectTimeout 的三分之一。 KeepAliveDisconnectTimeout 绝对不能相等。

    但是,如果 1.0.* 在KeepAlive 之后设置DisconnectTimeout,则keep-alive 将设置为DisconnectTimeout 的三分之一。在您的情况下,这将是 10 秒的默认值。

    SignalR 1.0 解决了很多问题,因此如果您还没有升级,那么绝对值得升级。但是,正如其他答案所指出的那样,.NET 客户端将不支持保持活动检查,并且在 1.1 之前不会识别网络电缆已被拔出

    附:如果您意识到它以某种方式断开连接,您可以随时手动重新启动您的Connection。在这种情况下,您的连接 ID 当然会改变。

    【讨论】:

    • 您好,感谢您的解释。抱歉,我应该提到我们使用的是 1.0.1 版本。原始问题现已更新。
    • 客户端保持活动 .net 客户端在 1.0.1 中仍然不可用,只是为了清楚。
    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多