2016-12-09 7 views
0

Моего приложения загружает архивный файл XML из Интернета и пытается создать читатель XML:Uncompressing корм XML

var fullReportUrl = "http://..."; // valid url here 
//client below is an instance of HttpClient 
var fullReportResponse = client.GetAsync(fullReportUrl).Result; 

var zippedXmlStream = fullReportResponse.Content.ReadAsStreamAsync().Result; 

XmlReader xmlReader = null; 
using(var gZipStream = new GZipStream(zippedXmlStream, CompressionMode.Decompress)) 
{ 
    try 
    { 
     xmlReader = XmlReader.Create(gZipStream, settings); 
    } 
    catch (Exception xmlEx) 
    { 

    } 
} 

Когда я пытаюсь создать читатель XML я получаю сообщение об ошибке:

«Магия число в заголовке GZip не является правильным. Убедитесь, что вы передаете в потоке GZip.

enter image description here

Когда я использую URL-адрес в браузере, я успешно загружаю zip-файл с хорошо отформатированным XML в нем. Моя ОС может распаковать его без каких-либо проблем. Я рассмотрел первые два символа загруженного файла, и они выглядят как «PK», которые соответствуют формату ZIP.

Возможно, мне не хватает шага в потоковых преобразованиях. Что я делаю не так?

+0

Вы попробовали ответ? –

ответ

1

Вам не нужно использовать GzipStream для декомпрессии любого ответа HTTP с помощью HttpClient. Вы можете использовать HttpClientHandlerAutomaticDecompression, чтобы сделать HttpClient распаковать запрос автоматически для вас.

HttpClientHandler handler = new HttpClientHandler() 
{ 
    // both gzip and deflate 
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
}; 

using (var client = new HttpClient(handler)) 
{ 
    var fullReportResponse = client.GetAsync(fullReportUrl).Result; 
} 

Edit 1:

Web-серверы будут не gzip выводить все запросы. Сначала они проверяют заголовок accept-encoding, если заголовок установлен и что-то вроде Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5, веб-сервер понимает, что клиент может поддерживать gzip или deflate, поэтому веб-сервер может (в зависимости от логики приложения или конфигурации сервера) сжимать вывод в gzip или deflate. В вашем сценарии я не думаю, что вы установили заголовок accept-encoding, чтобы веб-ответ возвращался несжатым. Хотя я рекомендую вам попробовать код выше.

Read more about accept-encoding on MDN

+0

эй, спасибо за ваш ответ, но установка AutmaticDecompression не сработала. Я все еще получаю сжатый поток байтов. Я добавил более подробную информацию здесь http://stackoverflow.com/questions/41353557/download-and-unzip-xml-file – AstroSharp