0

我们成功地从 iTunes autoingest 端点获取了许多报告: https ://reportingitc.apple.com/autoingestion.tft

然而,一些报告,而不是直接在正文中返回数据,而是返回一个 ZIP 文件,每当我们尝试读取响应时,我们都会得到:

GZip 标头中的幻数不正确。确保您传入的是 GZip 流。

响应标头如下所示,指示 zip 文件:

{
内容编码:
内容处置:附件;文件名=O_S_W_XXXXXXXX_20120805.zip
文件名:O_S_W_XXXXXXXX_20120805.zip
传输编码:分块
内容类型:应用程序/a-gzip
日期:2012 年 8 月 29 日星期三 08:54:35 GMT
Set- Cookie:JSESSIONID=XXXXXXXXXXXXXXXX;路径=/
服务器:Apache-Coyote/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

看看这个问题及其接受的答案

使用提琴手截取线路上的字节(请参阅 Inspectors 选项卡)。

从 API 中可以看出:流不是 GZipped 而是 Zipped。

在这里查看一个库以在 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 回答
0

终于想通了!

我需要设置:

webRequest.AutomaticDecompression = DecompressionMethods.None;

以前我将其设置为尝试:

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

.NET 在我有机会阅读之前尝试解压缩响应,但未能成功。

我现在可以读取字节数组并在将文件保存到磁盘后对其进行解密。

于 2012-09-19T11:16:23.150 回答