http keep-alive 行为 - 如何处理关闭的服务器套接字?

http keep-alive behavior - how to handle closed server socket?

我想了解应该如何处理保持活动状态,特别是 "case" 当服务器由于超时或使用单个套接字处理的请求的人为限制而关闭保持活动连接时。 我知道从一个关闭的套接字中读取将 return 0。在这种情况下,客户端应该做什么?它会尝试打开新连接吗?

下面的测试代码会定期执行 http 请求:

while (true)
{
    try
    {
        var httpResponse = await httpClient.GetAsync("https://192.168.1.22/api/v1/system/status/", cancellationToken);
        if (httpResponse.IsSuccessStatusCode)
        {
            Console.Write(".");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("HttpClientGetStatus- Exception - " + ex.GetType() + " " + ex.Message);
    }
   Thread.Sleep(this.StatusFreq * 1000);
}

当套接字被服务器关闭时,我没有看到任何异常。这是否意味着当客户端尝试在内部打开一个新套接字并且只要它有效时,就不会 return 向用户发送任何内容 [关于关闭旧套接字,而是打开新套接字]?在哪里可以找到规范或任何类型的规范,或者可以找到描述正确的 http 保持活动行为的文章?

谢谢

Where can I find specifications or any kind or perhaps an article describing the correct http keep-alive behavior?

RFC2616 第 8.1 节处理持久连接,尤其是第 8.1.4 节 "Practical Considerations" 与您的问题相关。引用:

A client, server, or proxy MAY close the transport connection at any time. ... clients, servers, and proxies MUST be able to recover from asynchronous close events. Client software SHOULD reopen the transport connection and retransmit the aborted sequence of requests without user interaction so long as the request sequence is idempotent (see section 9.1.2)...

换句话说:如果客户端在发送请求之前检测到服务器端关闭,它应该简单地为下一个请求打开一个新连接。如果它在发送请求期间检测到关闭,它应该仅针对幂等请求使用新连接重新启动。

HTTP 持久连接在 this wikipedia article 中有详细说明。

然而,在您的情况下,您不必担心套接字管理,因为 .Net HttpClient 库处理(并隐藏)所有这些低级内容。这就是为什么你没有得到任何与套接字重用相关的异常。