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

时间:2015-03-03 17:00:53

标签: iis-7.5 asp.net-web-api2 dotnet-httpclient

我在运行IIS 7.5的Windows Server 2008 R2上使用Web API 2.2创建了一个REST Web服务。我遇到的问题是,当我通过Google Chrome Postman应用程序发出请求时,Web服务正在返回压缩响应(Content-Encoding:gzip)。但是当我使用.NET 4.5.1 HttpClient发出相同的请求时,服务器不会返回压缩响应(Content-Encoding标头为空)。这是我的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标头。事实上,两者的请求标头完全相同,只是{H} {H}支持HttpClient请求中的Connection: keep-alive标头。有没有人知道为什么Web服务不会提供对HttpClient的压缩响应?

1 个答案:

答案 0 :(得分:0)

因此,我使用Fiddler监视HTTP流量并且看到服务器响应实际上在使用HttpClient时被压缩(Postman收到的字节数与HttpClient接收的字节数相同)并且已经发送了相应的Content-Encoding: gzip标题!我想HttpClient在自动解压缩模式下通过删除Content-Encoding: gzip标头来尝试智能化。这是在任何地方记录的吗?