Dot-Net

.NET:是否可以讓 HttpWebRequest 自動解壓縮 gzip 的響應?

  • May 12, 2010

這個答案中,我描述了我如何在 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 ...
   }
}

有沒有辦法讓 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);

謝謝。

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

HttpWebRequest hwr = (HttpWebRequest) WebRequest.Create(url);
hwr.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

無需手動添加Accept-EncodingHTTP 標頭;使用該屬性時將自動添加它。

(另外,我知道這只是範常式式碼,但HttpWebResponse對象應該放在一個using塊中,以便在您完成使用後正確處理它。)

引用自:https://stackoverflow.com/questions/2815721