我有要求从远程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格式发送?
你有没有试过得到原始的标题值而不是计算的属性? –
@ DanielA.White是的,它也是空的。我认为计算的值只是返回Headers集合中的值。 –