.NET: действительно ли возможно заставить HttpWebRequest автоматически распаковывать gzip'd ответы?

В этом ответе я описал, как я обратился к обертыванию GZipStream вокруг ответного потока в HttpWebResponse для распаковки его.

Соответствующие нормы похожи на это:

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

Спасибо.

31
задан Community 23 May 2017 в 11:46
поделиться

2 ответа

Используйте свойство HttpWebRequest.AutomaticDecompression следующим образом:

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

Нет необходимости вручную добавлять HTTP-заголовок Accept-Encoding ; он будет автоматически добавлен при использовании этого свойства.

(Кроме того, я знаю, что это всего лишь пример кода, но объект HttpWebResponse должен быть помещен в блок using , чтобы он правильно размещался, когда вы закончите его использовать.)

63
ответ дан 27 November 2019 в 22:07
поделиться

По моему опыту, он уже делает это автоматически. Мне пришлось явно отключить его, установив свойство AutomaticDecompression объекта Request в DecompressionMethods.None

0
ответ дан 27 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: