0

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

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 编程为在一段时间不活动后关闭应用程序池,并且池关闭发生在第一个请求之后但在下一个请求之前,那么来自客户端的下一个请求将不会Connection: Keep-Alive设置,因此保持 -活着不会踢。

为什么Connection: Keep-Alive只为第一个请求发送而不为后面的请求发送?

4

2 回答 2

1

HTTP/1.1 默认使用保持连接。客户端或服务器必须通过发送标头明确表明他们不想要 Keep-Alive 行为Connection: close

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

于 2013-12-17T17:42:46.647 回答
-1

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

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

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

您可以在此维基百科文章中找到有关此主题的更多信息。

于 2013-05-27T11:45:43.493 回答