【问题标题】:How to send TCP keep-alive packets如何发送 TCP 保持活动数据包
【发布时间】:2015-12-26 07:07:36
【问题描述】:

我需要在 javascript 客户端和 Web API 控制器操作之间建立长时间运行(比如 10 分钟)的连接。 Web 应用的 Azure 负载均衡器的默认超时时间为 4 分钟,目前无法配置。

如何通过发送 tcp keep-alive 数据包来保持连接?

  • 这可以在客户端、服务器端还是两者兼而有之?

  • 对于 .NET,我只能找到此选项 ServicePoint.SetTcpKeepAlive,但它似乎仅限于应用程序作为客户端发出请求的 HttpWebRequest。

  • 是否可以通过XMLHttpRequest从javascript发送keep-alive数据包?

【问题讨论】:

  • 你能经常发送一条虚拟消息吗? (您的客户不需要对每一句话都做出回应……)
  • 是的,但这会“污染”响应并需要额外的客户端逻辑,不是吗?我研究了 SingalR 和长轮询。可能是唯一的解决方案。
  • 这取决于您如何向客户端发送消息,例如 signalR,每条消息都有一个类型,并且只有您绑定侦听器的类型才会触发客户端操作,所以不,不会有额外的逻辑如果您使用事件发射器形状的源,则客户端。在污染方面,我认为保持开放比重新连接更干净,如果程序流看不到保持活动,我看不出有什么危害,Socket.IO和所有大狗都会这样做,如果它让你知道这一点感觉更好......

标签: javascript c# sockets asp.net-web-api keep-alive


【解决方案1】:
var socketsHandler = new SocketsHttpHandler
{
      PooledConnectionIdleTimeout = TimeSpan.FromHours(27),//Actually 5 mins can be idle at maximum. Note that timeouts longer than the TCP timeout may be ignored if no keep-alive TCP message is set at the transport level.
      MaxConnectionsPerServer = 10
};
client = new HttpClient(socketsHandler);

如您所见,虽然我将空闲超时设置为 27 小时,但实际上它只保持 5 分钟。

所以,最后我只是每 1 分钟使用相同的 HttpClient 调用目标端点。在这种情况下,始终存在已建立的连接。您可以使用 netstat 进行检查。它工作正常。

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多