为什么连接保持活动仅在第一次请求时使用WebRequest发送?

时间:2013-05-27 11:32:00

标签: c# .net iis webrequest keep-alive

我有以下代码用于测试目的

for( int i = 0; i < 5 ; i++ ) {   
   var url = "http://myserver.com/Warmup";
   var request = WebRequest.Create(url);
   using (WebResponse response = request.GetResponse()) {
       using (var stream = response.GetResponseStream()) {
           using (var reader = new StreamReader(stream)) {
               reader.ReadToEnd();
           }
       }
   }
}

当我用Fiddler运行它时,我发现只有第一个请求有Connection: Keep-Alive标题。

这意味着如果服务器被IIS编程为在一段时间不活动后关闭应用程序池,并且在第一个请求之后但在下一个请求之前发生了池关闭,那么来自客户端的下一个请求将不会{{ 1}}设置,所以keep-alive不会启动。

为什么Connection: Keep-Alive仅针对第一个请求而不是后续请求发送?

2 个答案:

答案 0 :(得分:1)

HTTP / 1.1默认使用keep-alive连接。客户端或服务器必须通过发送Connection: close标头明确指出他们不希望保持活动状态。

仅在第一个请求上发送Connection: Keep-Alive标头,因为客户端尚不知道服务器是否支持HTTP/1.1,或者它是否会返回HTTP/1.0响应。在服务器通过使用该版本发送响应来确认它支持HTTP/1.1之后,客户端知道它可以安全地丢弃冗余头。

答案 1 :(得分:-1)

我认为这是因为您正在为请求使用TCP连接。正如提到here,服务器创建一个TCP连接,负责处理您正在执行的所有请求。

由于TCP使用三次握手,因此服务器和客户端始终知道连接是否仍然可用。因此,每次服务器关闭连接时,它都会向客户端发送一个所谓的FIN位,以便客户端知道连接不再建立。

尽管您创建了5次webrequest,但客户端已经知道该请求,因为它在TCP / IP池中可用并且可以重用该连接,除非客户端要求最终结束连接。

您可以在this wikipedia article中找到有关此主题的更多信息。