2017-02-02 119 views
1

我有要求从远程URL下载一些内容,然后确定内容是否被压缩(Gzip或Deflate)。如何确定.NET HttpClient返回的内容是否被Gzipped?

我的问题是,当您允许HttpClient执行automatic decompression时,它不会返回response.Content.Headers.ContentEncoding属性中的任何值。如果你不要启用自动解压缩,那么它确实返回了ContentEncoding的正确值,但是你留下了一个没有被解压缩的Gzip文件,这是没有用的。

看看下面的代码:

var handler = new HttpClientHandler() 
{ 
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
}; 

using (var client = new HttpClient(handler)) 
{ 
    client.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate"); 
    client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); 

    using (var message = new HttpRequestMessage(HttpMethod.Get, new Uri("https://www.twitter.com"))) 
    { 
     using (var response = await client.SendAsync(message)) 
     { 
      if (response.IsSuccessStatusCode) 
      { 
       string encoding = String.Join(",", response.Content.Headers.ContentEncoding); 

       string content = await response.Content.ReadAsStringAsync(); 
      } 
     } 
    } 
} 

HttpClientHandler设置为使用AutomaticDecompression然后在内容的价值被成功申请为gzip和然后正确解压。但响应标头集合中的ContentEncoding值为空。

如果我删除行:

AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 

然后我得到了正确的ContentEncoding值(“压缩”)返回,但随后返回文档中它的原始压缩格式,这是没有好处的。

那么有没有什么办法可以获得内容,有时(但不是总是)会被GZip压缩并在它自动解压时自动解压缩,但之后又知道它最初是否以Gzip格式发送?

+0

你有没有试过得到原始的标题值而不是计算的属性? –

+0

@ DanielA.White是的,它也是空的。我认为计算的值只是返回Headers集合中的值。 –

回答

1

不是一个完整的答案,但我偷看了HttpClient的源代码,这导致我的底层HttpResponse的代码。在那里,你发现这块金:

if ((decompressionMethod & DecompressionMethods.GZip) != DecompressionMethods.None && str.IndexOf("gzip", StringComparison.CurrentCulture) != -1) 
    { 
    this.m_ConnectStream = (Stream) new GZipWrapperStream(this.m_ConnectStream, CompressionMode.Decompress); 
    this.m_ContentLength = -1L; 
    this.m_HttpResponseHeaders["Content-Encoding"] = (string) null; 
    } 

正如你所看到的,在最后一行,他们完全删除该头。我不完全确定为什么这就是他们决定要做的事情,但事实就是这样。

我想你的选择是要么自己解压缩,要么提出两个请求(两者都不是很好的选择)。

+0

谢谢,这很有趣 - 所以这是故意的。至少我知道我不会错过什么! –

+1

如果您正在寻找解压缩解决方案,[这里](http://stackoverflow.com/a/765318/3866548)我找到了一个人。 – AxelWass

+0

他们可能是这样做的,所以它不会混淆消费者,它不得不再次解压缩它 –

相关问题