【问题标题】:HTTP client request timeout handling in keep-alive connections保持活动连接中的 HTTP 客户端请求超时处理
【发布时间】:2015-10-05 02:26:18
【问题描述】:

关于 HTTP keep-alive 客户端应该如何处理请求超时?比如有一个流程:

  • 客户端发送Request1;
  • 客户端等待 1 分钟;
  • 客户端假设 Request1 失败并重新发送,即发送新的 Request2 = Request1;
  • 服务器响应 Response1(这是对 Request1 的响应);
  • 客户端假定这是对 Request2 的响应,但可以处理它,因为 Request1 = Request2;
  • 客户端发送Request3;
  • 服务器响应 Response2(这是对 Request2 的响应);
  • 客户端认为这是对 Request3 的响应,但未能处理。

我在specification 中找不到任何信息。它说明了如果连接被服务器关闭时如何重试,但没有说明请求花费太长时间才能继续的情况。

【问题讨论】:

    标签: http keep-alive http-pipelining


    【解决方案1】:

    我有使用 ASP.NET 的经验,但我不确定此范例是否用于所有 HTTP 管道。以下是我的理解:

    • 响应与请求相关联。在 C# 中,有一个 HttpContext 可以促进这一点。新请求来自一个单独的线程,该线程没有任何其他请求的安全上下文。
    • 当客户端发出请求时(例如,通过WebRequest),响应与该请求相关联。

    因此,您的示例中的Request1 永远不能与Request2 混淆。 HTTP 请求标头中使用的keep-alive 指示底层TCP connection shouldn't be closed,以便可以将其重用于其他请求。据我了解,单个请求超时不会影响底层 TCP 连接;也就是说,即使 TCP 连接是共享的,请求-响应机制也照常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2017-04-09
      • 2016-09-14
      • 2021-05-02
      • 2020-04-09
      • 2020-05-27
      相关资源
      最近更新 更多