如何确定由.NET HttpClient返回的内容是否经过Gzip压缩?

6

我有一个需求,需要从远程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发送?


你尝试过获取原始标头值而不是计算属性吗? - Daniel A. White
@DanielA.White 是的,它也是空的。我认为计算值只返回标头集合中的值。 - Dan Diplo
1个回答

7

虽然不能完全回答您的问题,但是我查看了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;
  }

正如你所看到的,最后一行他们完全删除了该标题。我不太确定为什么他们决定这样做,但它就是这样。

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


谢谢,这很有趣 - 所以这是故意的。至少我知道我没有错过什么! - Dan Diplo
2
如果您正在寻找自行解压缩的解决方案,在这里我找到了一个已经完成此任务的人。 - AxelWass
2
他们可能这样做是为了不让消费者感到困惑,因为它不需要再次解压缩。 - Daniel A. White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接