2013-08-30 77 views
0

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

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

//我正在[] 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 =新GZipStream(插播广告,CompressionMode.Decompress,真); ”

任何帮助,将不胜感激

回答

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) {...} 
+0

该库不支持windows phone 8 – wandos

+0

该库支持即使便携库。 wp7项目的示例(以上)部分。 – pbd

1

如果您使用压缩标头,则无需执行任何操作。服务器压缩和客户端自动解压缩,您不必担心任何事情。然而,听起来你正在使用一些专有的内容压缩标准,你只能压缩其中的一部分。如果是这种情况,请不要混淆http客户端上的任何压缩设置,而应使用第三方解压缩库。只需在响应流中查找300个字节,然后将该流传递给库。你应该可以从我的gzip库中使用我的inflater,你可以在这里找到: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个字节在内的所有内容。那里的所有小猫都容易和更好。