2015-11-18 16 views
0

我想了解如何处理keep-alive,尤其是服务器由于超时或使用单个套接字处理的请求的人为限制而关闭保持活动连接时的“情况”。 我知道从关闭的套接字读取将返回0.在这种情况下客户端应该做什么?它尝试打开新的连接吗?http keep-alive行为 - 如何处理关闭的服务器套接字?

下面的测试代码做定期执行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保持活动行为的文章?

谢谢

回答

0

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

但在你的情况下,你不必担心套接字管理,因为.Net HttpClient库处理(和隐藏)所有这些低级别的东西。这就是为什么你没有得到任何有关套接字重用的异常。

+0

我接受了答案。谢谢。为了澄清,我是否正确理解当套接字关闭时,客户端库重试请求? –

+0

@MosheShmukler是的,我认为是 – fiddler

1

我在哪里可以找到规范或任何形式或者可能是文章描述正确的HTTP保持活动的行为?

RFC2616 8.1节涉及持续连接,尤其是第8.1.4节“实际考虑”与您的问题有关。引用:

客户端,服务器或代理可以在任何 时间关闭传输连接。 ...客户端,服务器和代理必须能够从异步关闭事件中恢复 。客户端软件应该重新打开 传输连接和重传请求 的中止序列而无需用户交互,只要请求序列是 幂等(参见9.1.2节)...

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

+0

Steffen Ullrich - 谢谢。多谢!!! –

相关问题