Почему HttpWebResponse пытается распаковать поток с помощью GZip, когда Content-Encoding пуст? - PullRequest
2 голосов
/ 19 февраля 2012

Я рассмотрел множество вопросов и ответов по этой теме и дошел до того, что я использую следующий код для получения байтов из заданного URI:

var request = (HttpWebRequest)WebRequest.Create(uri);
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
var response = request.GetResponse();
var stream = response.GetResponseStream();
if (stream != null)
{
    var buffer = new byte[4097];
    var memoryStream = new MemoryStream();

    do
    {
        var count = stream.Read(buffer, 0, buffer.Length);
        memoryStream.Write(buffer, 0, count);

        if (count == 0)
            break;
    } while (true);

    return memoryStream.ToArray();
}

response.Close();

return null;

Теперь для определенного URI (который указывает на файл) при отладке я вижу, что заголовок «Content-Encoding» веб-ответа равен нулю («»), но при попытке чтения из поток, он выдает исключение:

System.IO.InvalidDataException: магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip.

При отладке того же URI в инструментах разработчика я получаю это в заголовках ответа:

Content-Encoding: GZIP, выкачать

Так что я действительно не знаю, что происходит.

Какие-нибудь подсказки и идеи о том, как избежать этого исключения и успешно прочитать байты файла?

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2017

.NET Framework очищает этот заголовок как часть автоматической декомпрессии.Я предполагаю, что это потому, что вы просите инфраструктуру обработать его автоматически, и поток ответов, который вы получаете, больше не сжимается.

Мне просто нужно было самому посмотреть это, изучив исходный код HttpWebResponse на Microsoft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...