wake-up-neo.com

.NET: Ist es möglich, dass HttpWebRequest gzip-Antworten automatisch dekomprimiert?

In this answer habe ich beschrieben, wie ich versucht habe, einen GZipStream um den Antwortstream in einer HttpWebResponse zu schreiben, um ihn zu dekomprimieren.

Der relevante Code sieht folgendermaßen aus:

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 ...
    }
}

Gibt es eine Möglichkeit, HttpWebResponse dazu zu bringen, automatisch einen dekomprimierenden Stream bereitzustellen? Mit anderen Worten, eine Möglichkeit für mich, das Folgende aus dem obigen Code zu entfernen:

      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);

Vielen Dank.

31
Cheeso

Verwenden Sie die Eigenschaft HttpWebRequest.AutomaticDecompression wie folgt:

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

Es ist nicht erforderlich, den HTTP-Header Accept-Encoding manuell hinzuzufügen. Es wird automatisch hinzugefügt, wenn diese Eigenschaft verwendet wird.

(Ich weiß auch, dass dies nur Beispielcode ist, aber das Objekt HttpWebResponse sollte in einem Block using platziert werden, damit es korrekt angeordnet wird, wenn Sie es nicht mehr verwenden.)

62

Meine Erfahrung ist, dass es das schon automatisch macht. Ich musste es explizit deaktivieren, indem ich die AutomaticDecompression -Eigenschaft des Request-Objekts auf DecompressionMethods.None setzte.

0
snoopy-do