IIS 为 Chrome Postman 但不为 .NET HttpClient 提供压缩 (gzip) 响应

IIS serves a compressed (gzip) response to Chrome Postman but not to .NET HttpClient

我在 Windows Server 2008 R2 box 运行 IIS 7.5 上使用 Web API 2.2 创建了一个 REST Web 服务。我遇到的问题是,当我通过 Google Chrome Postman 应用程序发出请求时,Web 服务正在 returning 压缩响应(Content-Encoding:gzip) .但是当我使用 .NET 4.5.1 HttpClient 发出相同的请求时,服务器不会 return 压缩响应(Content-Encoding header 为空白)。这是我的 C# 代码:

var handler = new HttpClientHandler();
handler.UseProxy = false;
handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
handler.Credentials = CredentialCache.DefaultNetworkCredentials;

var client = new HttpClient(handler);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-US"));
client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue { NoCache = true };
client.DefaultRequestHeaders.Connection.Add("keep-alive");

var response = await client.GetAsync("https://localhost/mywebsite");

注意:我正在使用 SSL 连接。我可以确认 Web API Web 服务正在接收来自 Postman 应用程序请求和 HttpClient 请求的 Accept-Encoding: gzip header。实际上,两者的请求 header 完全相同,只是 Connection: keep-alive header 似乎从 HttpClient 请求中剥离了。有谁知道为什么 Web 服务不提供对 HttpClient 的压缩响应?

所以,我使用 Fiddler 和 lo 监视 HTTP 流量,发现服务器响应实际上在使用 HttpClient 时被压缩了(Postman 接收到的字节数与 HttpClient 接收到的字节数相同)并且发送相应的Content-Encoding: gzipheader!我猜想 HttpClient 试图通过在自动解压模式下删除 Content-Encoding: gzip header 来变得聪明。这在任何地方都有记录吗?