如何判断 .NET HttpClient 返回的内容是否是 Gzip 压缩的?

Dan*_*plo 5 .net c# gzip dotnet-httpclient

我需要从远程 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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

HttpClientHandler设置为使用时AutomaticDecompression,内容中的值将被成功请求为 GZip,然后正确解压缩。但是ContentEncoding响应头集合中的值为空。

如果我删除该行:

AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
Run Code Online (Sandbox Code Playgroud)

然后我确实得到了ContentEncoding返回的正确值(“gzip”),但是文档以原始压缩格式返回,这是不好的。

那么有什么方法可以获取有时(但并非总是)被 GZipped 压缩的内容并在它被解压缩时自动解压缩它,但之后才知道它是否最初是作为 Gzip 发送的?

BFr*_*ree 5

不是一个完整的答案,但我偷看了 的源代码,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;
  }
Run Code Online (Sandbox Code Playgroud)

如您所见,在最后一行,他们完全删除了该标题。我不完全确定为什么他们决定这样做,但事实就是这样。

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

  • 如果您正在寻找自己解压的解决方案,[这里](http://stackoverflow.com/a/765318/3866548) 我找到了这样做的人。 (2认同)
  • 他们这样做可能是为了让消费者不会因为必须再次解压而感到困惑 (2认同)