0

WP8 不支持 Gzip 压缩,但是有 3rd 方库可以让你这样做,我尝试了很多,但我无法让它工作。这是我最近的尝试:

var handler = new HttpClientHandler();

        if (handler.SupportsAutomaticDecompression)
        {
            handler.AutomaticDecompression = DecompressionMethods.GZip |
                                             DecompressionMethods.Deflate;
        }

        Uri myUri = new Uri("http://www.web.com");

        HttpClient client = new HttpClient(handler);

        client.BaseAddress = myUri;

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Add("ubq-compression", "gzip");

        HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, myUri);
        req.Content = new StringContent(finalURL, Encoding.UTF8);

        HttpResponseMessage rm = client.SendAsync(req).Result;
        string rst = await rm.Content.ReadAsStringAsync();

API返回给我一个字节数组,但前300个不是Gziped,但其他一切都是

我需要解压缩 300 字节之后的所有内容。

我正在使用http://www.nuget.org/packages/Microsoft.Net.Http

// 我正在拆分数组 byte[] hJ = res.Take(300).ToArray(); byte[] bJ = res.Skip(300).ToArray();

bj 是需要解压的。

我正在尝试这个

MemoryStream 流 = 新的 MemoryStream(); stream.Write(bj, 0, bj.Length);

                using (var inStream = new MemoryStream(bj)) 
                {
                    var bigStreamsss = new GZipStream(inStream, CompressionMode.Decompress, true);

                    using (var bigStreamOut = new MemoryStream())
                    {
                        bigStreamsss.CopyTo(bigStreamOut);
                        output = Encoding.UTF8.GetString(bigStreamOut.ToArray(), 0, bigStreamOut.ToArray().Length);
                    }

                }

但它总是在这条线上失败“ var bigStreamsss = new GZipStream(inStream, CompressionMode.Decompress, true); ”

任何帮助将非常感激

4

2 回答 2

1

如果您使用的是压缩标头,则无需执行任何操作。服务器自动压缩,客户端自动解压,您无需担心任何事情。但是,听起来您正在使用一些专有的内容压缩标准,而您只压缩其中的一部分。如果是这种情况,请不要弄乱 http 客户端上的任何压缩设置,而是使用 3rd 方解压缩库。只需在响应流上查找 300 个字节,然后将该流传递给库。您应该可以使用我的 gzip 库中的充气机,您可以在这里找到:https ://github.com/dotMorten/SharpGIS.GZipWebClient/blob/master/src/SharpGIS.GZipWebClient/GZipDeflateStream.cs 它非常轻-重量(只是这一个文件)。第一次通话

myResultStream.Seek(300, SeekOrigin.Begin);

如果流不可搜索,则需要先读取前 300 个字节。然后用我的类解压剩下的:

流 gzipStream = new SharpGIS.GZipInflateStream(myResultStream);

您现在可以像读取未压缩流一样读取 gzipStream。

但是我真的不明白你为什么不使用标准的 http 压缩并让服务器压缩包括前 300 个字节在内的所有内容。对于那里的所有小猫来说,这更加容易和更好。

于 2013-08-30T14:39:12.797 回答
0

您可以使用http://www.componentace.com/zlib_.NET.htm库(可通过 nuget 获得):

请求处理程序的一部分:

            try {
                var request = (HttpWebRequest)callbackResult.AsyncState;
                using (var response = request.EndGetResponse(callbackResult))
                using (var stream = response.GetResponseStream()) {
                    bool zip = false;
                    if (response.Headers.AllKeys.Contains("Content-Encoding") &&
                        response.Headers[HttpRequestHeader.ContentEncoding].ToLower() == "gzip") zip = true;
                    using (var reader = zip ?
#if NETFX_CORE
                        new StreamReader(new GZipStream(stream, CompressionMode.Decompress))
#else
                        new StreamReader(new zlib.ZOutputStream(stream), false)
#endif
                        : new StreamReader(stream)) {
                        var str = reader.ReadToEnd();
                        result = new ObjectResult(str);
                    }
                }
            } 
catch (WebException e) {...}
于 2013-08-30T08:03:30.303 回答