我有以下代码用于测试目的
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
仅针对第一个请求而不是后续请求发送?
答案 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中找到有关此主题的更多信息。