我想了解应该如何处理keep-alive,特别是当服务器由于超时或使用单个套接字处理的请求的人为限制而关闭keep-alive连接时的“情况” . 我知道从一个封闭的套接字读取将返回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);
}
当服务器关闭套接字时,我没有看到任何异常 . 这是否意味着当客户端尝试在内部打开一个新的套接字并且只要它工作时,没有[关于旧的套接字被关闭而新的套接字被打开]被返回给用户?我在哪里可以找到规范或任何类型或者描述正确的http keep-alive行为的文章?
谢谢
2 回答
HTTP持久连接在this wikipedia article中有详细说明 .
但是在您的情况下,您不必担心套接字管理,因为.Net HttpClient库处理(并隐藏)所有这些低级别的东西 . 's why you don't获得与套接字重用相关的任何异常 .
RFC2616第8.1节涉及持久性连接,尤其是第8.1.4节"Practical Considerations"与您的问题相关 . 引用:
换句话说:如果客户端在发送请求之前检测到服务器端关闭,则应该只为下一个请求打开一个新连接 . 如果它在发送请求期间检测到关闭,则应该仅针对幂等请求重新启动新连接 .