首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WP8 Gzip压缩

WP8 Gzip压缩
EN

Stack Overflow用户
提问于 2013-08-30 15:18:53
回答 2查看 1.5K关注 0票数 0

WP8不支持Gzip压缩,但是有第三方的库可以让你这样做,我已经尝试了很多次,但是我不能让它工作。这是我最新的尝试:

var处理程序=新的HttpClientHandler();

代码语言:javascript
复制
        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);

代码语言:javascript
复制
                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);”这一行上失败。

任何帮助都将不胜感激

EN

回答 2

Stack Overflow用户

发布于 2013-08-30 22:39:13

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

myResultStream.Seek(300,SeekOrigin.Begin);

如果流不可查找,则需要首先读取前300个字节。然后使用我的类对其余部分进行解压缩:

流gzipStream =新的SharpGIS.GZipInflateStream(myResultStream);

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-30 16:03:30

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

请求处理程序的一部分:

代码语言:javascript
复制
            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) {...}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18527115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档