2016-12-09 15 views
0

私のアプリケーションは、Webからのzip形式のXMLファイルをダウンロードし、XMLリーダーを作成しようとします:解凍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を使用すると、適切にフォーマットされたXMLを含むzipファイルが正常にダウンロードされます。私のOSは問題なく解凍できます。ダウンロードしたファイルの最初の2文字を調べ、ZIP形式と一致する「PK」と表示されます。

ストリーム変換の手順が不足している可能性があります。私は間違って何をしていますか?

+0

答えを試しましたか? –

答えて

1

HttpClientを使用してhttp応答を解凍する場合は、GzipStreamを使用する必要はありません。 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; 
} 

編集1:

Webサーバーgzip出力のすべての要求ではないでしょう。ヘッダが設定されていて、それがWebサーバは、クライアントがgzipまたはdeflateので、Webサーバーが(アプリケーションロジックやサーバーの構成によって異なります)gzipまたはdeflateに出力を圧縮する可能性がサポートできる理解Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5のようなものである場合は、最初の彼らは、accept-encodingヘッダーを確認してください。あなたのシナリオでは、accept-encodingヘッダーを設定しているとは思わないので、Webレスポンスは圧縮されずに返されます。上記のコードを試してみることをお勧めしますが。

Read more about accept-encoding on MDN

+0

お返事ありがとうございますが、AutmaticDecompressionを設定しても機能しませんでした。私はまだバイトの圧縮ストリームを取得します。私はここに詳細を追加http://stackoverflow.com/questions/41353557/download-and-unzip-xml-file – AstroSharp