为什么只有在使用WebRequest的第一个请求时才发送连接保持活动

本文关键字:连接 活动 请求 第一个 WebRequest 为什么 | 更新日期: 2023-09-27 18:15:25

我有以下代码用于测试

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只针对第一个请求而不针对后面的请求发送?

为什么只有在使用WebRequest的第一个请求时才发送连接保持活动

HTTP/1.1默认情况下使用保持活动连接。客户端或服务器必须通过发送Connection: close标头来明确表示他们不希望"保持活动"行为。

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

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

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

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

你可以在这篇关于这个主题的维基百科文章中找到更多信息。