HttpWebRequest & Native GZip Compression

При запросе страницы с сжатием Gzip я получаю много следующих ошибок:

System.IO.InvalidDataException: CRC в нижнем колонтитуле GZip не соответствует CRC, рассчитанному из распакованных данных

Я использую родной GZipStream для распаковки, и я смотрю на это. Имея это в виду, есть ли работа для решения этой или другой библиотеки GZip (бесплатно?), Которая будет правильно обрабатывать эту проблему?

Я проверяю webResponse ContentEncoding – это GZIP

Обновление 5/11 Упрощенный снипп

//Caller public void SOSampleGet(string url) { // Initialize the WebRequest. webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = WebRequestMethods.Http.Get; webRequest.KeepAlive = true; webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; webRequest.Headers.Add("Accept-Encoding", "gzip,deflate"); webRequest.Referer = WebUtil.GetDomain(url); HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); using (Stream stream = GetStreamForResponse(webResponse, READTIMEOUT_CONST)) { //use stream } } //Method private static Stream GetStreamForResponse(HttpWebResponse webResponse, int readTimeOut) { Stream stream; switch (webResponse.ContentEncoding.ToUpperInvariant()) { case "GZIP": stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress); break; case "DEFLATE": stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress); break; default: stream = webResponse.GetResponseStream(); stream.ReadTimeout = readTimeOut; break; } return stream; } 

Как насчет веб-ресурса AutomaticDecompression Property, доступного с .net 2? Просто добавьте:

 webRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 

Он также добавляет gzip, deflate в заголовок кодировки accept.

См. http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.automaticdecompression.aspx

Вы смываете и закрываете stream? Попробуйте обернуть свой GZipStream с помощью инструкции.

Я нашел пример кода, который показывает весь запрос / ответ для GZip-кодированных страниц. Он использует GZipStream.

http://www.know24.net/blog/Decompress+GZip+Deflate+HTTP+Responses.aspx

См. Мой комментарий выше, но это обычно является симптомом поврежденного файла. Если сайт является вашим собственным, замените файл, к которому вы пытаетесь получить доступ.

Для .NET Core вещи немного больше связаны. GZipStream необходим, поскольку для AutomaticCompression нет свойства (с GZipStream написания). См. Мой ответ здесь: https://stackoverflow.com/a/44508724/2421277

Код из ответа:

 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}"; } } } 

Нативный GZipStream может читать сжатый stream GZIP ( RFC 1952 ), но он не может обрабатывать формат ZIP-файла.

С http://www.geekpedia.com/tutorial190_Zipping-files-using-GZipStream.html :

Недостатком использования classа GZipStream над сторонним продуктом является то, что он имеет ограниченные возможности. Одно из ограничений заключается в том, что вы не можете указать имя файла, который вы размещаете в архиве. Когда GZipStream сжимает файл в ZIP-архив, он берет последовательность байтов из этого файла и использует алгоритмы сжатия, которые создают меньшую последовательность байтов. Новая последовательность байтов помещается в новый ZIP-файл. Когда вы открываете ZIP-файл, вы откроете сам архивный файл; самые популярные ZIP-экстракторы (WinZip, WinRar и т. д.) покажут вам содержимое ZIP в виде файла, который имеет тот же самый, что и сам архив.


EDIT: приведенная выше заметка неверна . GZipStream не создает ZIP-файл. Это не «stream ZIP с одним файлом». Это stream GZIP. Это разные вещи. Нет никакой гарантии, что инструменты, обрабатывающие ZIP-архивы, будут обрабатывать файл .gz.


Для реализации, которая может читать ZIP-архивы, в отличие от однопоточных ZIP-streamов, попробуйте #ziplib (SharpZipLib, ранее NZipLib) .

  • Почему ostream_iterator работает не так, как ожидалось?
  • Как объединить два экземпляра System.Io.Stream в один?
  • flush в java.io.FileWriter
  • Какова цель сериализации в Java?
  • Запись в InputStream Java-процесса
  • Различные способы загрузки файла в качестве InputStream
  • Прочитайте файл / URL-адрес по строке в Swift
  • C ++ настраиваемый манипулятор streamа, который изменяет следующий элемент в streamе
  • endl и очистка буфера
  • Должен ли я вызвать Close () или Dispose () для объектов streamа?
  • Утилизирует ли stream streamreader stream streamа?
  • Interesting Posts

    Как предотвратить System.Xml.XmlException: недопустимый символ в данной кодировке

    Что такое личные байты, виртуальные байты, рабочий набор?

    Как вы сопоставляете несколько параметров запроса с полями компонента в запросе Джерси GET?

    Выполнение стартовых заданий как непривилегированных пользователей

    Сплит-кадр данных по уровням фактора и именных кадров данных по этим уровням

    Редактор изображений, который позволяет сохранять множественные, отдельные, одновременные выборки культур? (Ищет бесплатные и платные программы)

    Как автозапуск приложения для Android?

    Как избежать строки JSON?

    Как писать на страницу OneNote 2013 с использованием C # и OneNote Interop

    Извлеките большой ZIP-файл (50 ГБ) на Mac OS X

    Пароль к ключевой функции, совместимой с командами OpenSSL?

    Что такое «Content-type: application / json; charset = utf-8 “действительно означает?

    Разделить строку на слова несколькими разделителями

    Какова конкретная проблема с множественным наследованием?

    Патч предотвращает запуск системы, необходимо вручную удалить обновление Windows 7

    Давайте будем гением компьютера.