Распаковывает ли .NET HttpWebResponse ответы GZiped и Deflated автоматически?

Я пытаюсь выполнить запрос, который принимает сжатый ответ

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");

Интересно, придется ли, когда я добавлю вторую строку, обрабатывать декомпрессию вручную.


person Jader Dias    schedule 24.03.2009    source источник
comment
Думаю, Рик Страл ошибается. Вы сами пробовали?   -  person Keltex    schedule 24.03.2009
comment
спасибо - просто пытаюсь понять вещи, вы можете сказать мне, правильно ли это? (a) если вы НЕ добавляете эту строку AcceptEncoding, тогда - если вы загружаете несжатый файл = ›работает ОТЛИЧНО - если вы загружаете сжатый файл =› ПРОБЛЕМА (файл будет загружен, но будет выглядеть поврежденным, поскольку он не был несжатым) (б) если вы ДЕЙСТВИТЕЛЬНО добавляете эту строку AcceptEncoding, то: - если вы загружаете несжатый файл = ›по-прежнему работает ОТЛИЧНО - если вы загружаете сжатый файл =› работает нормально (будет несжатым) Это правильно?   -  person Greg    schedule 28.09.2009
comment
@Greg Ни одного из вариантов. Вторая строка касается не загрузки файлов, которые, возможно, уже были сжаты (например, файлов zip), а загрузки веб-ресурсов, которые могут быть сжаты по запросу (например, файлов HTML). Если вы не укажете вторую строку, хорошо работающий веб-сервер вообще не будет отправлять вам сжатые файлы. Если веб-сервер имеет возможность сжимать файлы, он будет делать это, только если вы поставите вторую строку.   -  person Jader Dias    schedule 28.09.2009
comment
проголосуйте за вопрос тоже :)   -  person sumit_programmer    schedule 10.05.2011


Ответы (4)


Я нашел ответ.

Вы можете изменить код на:

var request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

И у вас будет автоматическая декомпрессия. Остальную часть кода менять не нужно.

person Jader Dias    schedule 24.03.2009
comment
хороший ответ, мне очень помогли :) - person sumit_programmer; 10.05.2011
comment
Технически вам нужна всего одна строка - AutomaticDecompression. Вроде автоматически добавляет gzip, deflate в заголовки. - person LongZheng; 02.02.2012
comment
Есть ли проблемы с выходом из набора автоматической декомпрессии, даже если ответ не сжат? В соответствии с этим сервером нормально не сжимать каждый ответ: developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ - person Joey Eng; 02.11.2018

Для .NET Core все немного сложнее. GZipStream необходим, поскольку нет свойства (на момент написания) для AutomaticCompression. Рассмотрим следующий GET пример:

var req = WebRequest.CreateHttp(uri);

/*
 * Headers
 */
req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";

/*
 * Execute
 */
try
{
    using (var resp = await req.GetResponseAsync())
    {
        using (var str = resp.GetResponseStream())
        using (var gsr = new GZipStream(str, CompressionMode.Decompress))
        using (var sr = new StreamReader(gsr))

        {
            string s = await sr.ReadToEndAsync();  
        }
    }
}
catch (WebException ex)
{
    using (HttpWebResponse response = (HttpWebResponse)ex.Response)
    {
        using (StreamReader sr = new StreamReader(response.GetResponseStream()))
        {
            string respStr = sr.ReadToEnd();
            int statusCode = (int)response.StatusCode;

            string errorMsh = $"Request ({url}) failed ({statusCode}) on, with error: {respStr}";
        }
    }
}
person pim    schedule 12.06.2017

Ответы GZIP и Deflate не обрабатываются автоматически. Подробнее см. В этой статье: HttpWebRequest и GZip Http-ответы

person Jeroen Landheer    schedule 24.03.2009
comment
Извините, я смешивал это с классами запросов и ответов HttpListener. Стандартный веб-запрос в .Net действительно обрабатывает сжатые ответы. - person Jeroen Landheer; 19.10.2009

Я думаю, вам нужно самому распаковать поток. Вот статья о том, как это сделать:

http://www.west-wind.com/WebLog/posts/102969.aspx

person Keltex    schedule 24.03.2009
comment
Хорошая находка. Похоже, это было добавлено в .NET 2.0. Возможно, Страл, когда писал свою статью, привык к 1.1. - person Keltex; 24.03.2009
comment
Использование HttpWebRequest.AutomaticDecompression автоматически добавляет правильные заголовки запроса и обрабатывает распаковку. - person Armbrat; 06.10.2009
comment
Я не думаю, что AutomaticDecompression добавит Accept-Encoding = gzip, deflate в заголовки. Я использую .NETCF3.5, и заголовки не добавлены, если я не добавлю их с помощью request.Headers.Add (HttpRequestHeader.AcceptEncoding, gzip, deflate); - person pixel; 07.09.2015