我有一个需求,需要从远程URL下载一些内容,并确定该内容是否已被压缩(Gzip或Deflate)。
我的问题是当你允许HttpClient执行自动解压缩时,它不会在response.Content.Headers.ContentEncoding
属性中返回任何值。如果你不启用自动解压缩,那么它会为ContentEncoding
返回正确的值,但是你将得到一个未被解压缩的Gzipped文档,这是没有用处的。
请看下面的代码:
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压缩的内容,并在需要时自动解压缩它,但之后知道它最初是否作为Gzip发送?