0

iTunesのautoingestエンドポイントから多くのレポートを正常に取得しています: https ://reportingitc.apple.com/autoingestion.tft

ただし、一部のレポートでは、本文に直接データを返すのではなく、ZIPファイルが返され、応答を読み取ろうとすると次のようになります。

GZipヘッダーのマジックナンバーが正しくありません。GZipストリームを渡していることを確認してください。

応答ヘッダーは次のようになり、zipファイルを示します。

{
Content-Encoding:
Content-Disposition:attachment; filename = O_S_W_XXXXXXXX_20120805.zip
filename:O_S_W_XXXXXXXX_20120805.zip
Transfer-Encoding:chunked
Content-Type:application / a-gzip
Date:Wed、29 Aug 2012 08:54:35 GMT
Set-クッキー:JSESSIONID = XXXXXXXXXXXXXXXX; パス=/
サーバー:Apache-Coyote / 1.1
}

しかし、この添付ファイルにアクセスする方法がよくわかりません。エラーは、添付ファイルと応答の他の部分の両方を1回の操作で準備しようとしているのに対し、実際には応答の一部のみであるという事実に関係している可能性があります。ジッパー。

コードは次のようになります。

HttpWebRequest w = (HttpWebRequest)WebRequest.Create(url);
w.Method = "POST";

byte[] byteArray = Encoding.UTF8.GetBytes(postData);

w.ContentLength = byteArray.Length;

using (Stream dataStream = w.GetRequestStream())
{

dataStream.Write(byteArray, 0, byteArray.Length);

dataStream.Close();

using (WebResponse resp = w.GetResponse())
{

    using (System.IO.Compression.GZipStream s = new System.IO.Compression.GZipStream(resp.GetResponseStream(), System.IO.Compression.CompressionMode.Decompress))
    {
    // Just trying to read one byte causes the error.
    s.ReadByte();
    }

}

どんなアイデアでも大歓迎です。

4

2 に答える 2

0

最後にこれを理解しました!

私は設定する必要がありました:

webRequest.AutomaticDecompression = DecompressionMethods.None;

以前は、次のことを試みるように設定していました。

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

そして、.NET は、私がそれを読む前に、応答を解凍しようとして失敗しました。

ディスクに保存された後、バイト配列を読み取ってファイルを復号化できるようになりました。

于 2012-09-19T11:16:23.150 に答える
0

この質問とその受け入れられた答えを見てください。

Fiddlerを使用して、ネットワーク上のバイトをインターセプトします ([インスペクター] タブを参照)。

API からわかるように、ストリームは GZipped ではなく、Ziped です。

C# でストリームを解凍するためのライブラリについては、こちらをご覧ください。

アプリの開始時に追加して、http 100 応答を克服します。

ServicePointManager.Expect100Continue = true;

これを使用して、WebResponse を取得した直後に、次のように解凍を実装します。

using (ZipInputStream s = new ZipInputStream(resp.GetResponseStream()) {

    ZipEntry theEntry;
    while ((theEntry = s.GetNextEntry()) != null) {

        Console.WriteLine(theEntry.Name);

        string directoryName = Path.GetDirectoryName(theEntry.Name);
        string fileName      = Path.GetFileName(theEntry.Name);

        // create directory
        if ( directoryName.Length > 0 ) {
            Directory.CreateDirectory(directoryName);
        }

        if (fileName != String.Empty) {
            using (FileStream streamWriter = File.Create(theEntry.Name)) {

                int size = 2048;
                byte[] data = new byte[2048];
                while (true) {
                    size = s.Read(data, 0, data.Length);
                    if (size > 0) {
                        streamWriter.Write(data, 0, size);
                    } else {
                        break;
                    }
                }
            }
        }
    }
}
于 2012-08-30T08:12:27.947 に答える