.NET:是否有可能让HttpWebRequest自动解压缩gzip的响应?

Che*_*eso 31 .net gzip httpwebrequest

这个答案中,我描述了如何在HttpWebResponse中围绕响应流使用GZipStream包围,以便对其进行解压缩.

相关代码如下所示:

HttpWebRequest hwr = (HttpWebRequest) WebRequest.Create(url);
hwr.CookieContainer =
    PersistentCookies.GetCookieContainerForUrl(url);
hwr.Accept = "text/xml, */*";
hwr.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
hwr.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-us");
hwr.UserAgent = "My special app";
hwr.KeepAlive = true;

using (var resp = (HttpWebResponse) hwr.GetResponse()) 
{
    using(Stream s = resp.GetResponseStream())
    {
        Stream s2 = s;
        if (resp.ContentEncoding.ToLower().Contains("gzip"))
            s2 = new GZipStream(s2, CompressionMode.Decompress);
        else if (resp.ContentEncoding.ToLower().Contains("deflate"))
            s2 = new DeflateStream(s2, CompressionMode.Decompress);

         ... use s2 ...
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让HttpWebResponse自动提供解压缩流?换句话说,我可以从上面的代码中消除以下内容:

      Stream s2 = s;
      if (resp.ContentEncoding.ToLower().Contains("gzip"))
          s2 = new GZipStream(s2, CompressionMode.Decompress);
      else if (resp.ContentEncoding.ToLower().Contains("deflate"))
          s2 = new DeflateStream(s2, CompressionMode.Decompress);
Run Code Online (Sandbox Code Playgroud)

谢谢.

Bra*_*ger 63

使用HttpWebRequest.AutomaticDecompression属性,如下所示:

HttpWebRequest hwr = (HttpWebRequest) WebRequest.Create(url);
hwr.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
Run Code Online (Sandbox Code Playgroud)

没有必要手动添加Accept-EncodingHTTP标头; 使用该属性时会自动添加它.

(另外,我知道这只是示例代码,但是HttpWebResponse对象应该放在一个using块中,以便在完成使用后正确处理.)

  • "没有必要手动添加Accept-Encoding HTTP标头" - 此外,如果这样做,"gzip"和"deflate"值将在标头中重复,这可能会导致某些服务器拒绝该请求. (5认同)