WP8 Gzip compression
本文关键字:compression Gzip WP8 | 更新日期: 2023-09-27 18:29:40
WP8不支持Gzip压缩,但有第三方库可以允许您这样做,我已经尝试过很多次,但无法使其工作。这是我最近的一次尝试:
var handler=新的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();流动写入(bj,0,bj.长度);
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(inStream,CompressionMode.Descress,true);"
任何帮助都将不胜感激
如果您使用压缩头,则无需执行任何操作。服务器会自动压缩,客户端会自动解压缩,您不必担心任何事情。然而,听起来你在使用一些专有的内容压缩标准,只压缩其中的一部分。如果是这样的话,不要在http客户端上破坏任何压缩设置,而是使用第三方解压缩库。只需在响应流上查找300个字节,然后将该流传递给库。你应该可以使用我的gzip库中的充气机,你可以在这里找到:https://github.com/dotMorten/SharpGIS.GZipWebClient/blob/master/src/SharpGIS.GZipWebClient/GZipDeflateStream.cs它非常轻(只有一个文件)。首次呼叫
myResultStream.Seek(300,SeekOrigin.Begin);
如果流不可查找,则需要先读取前300个字节。然后使用我的类来解压缩其余部分:
Stream gzipStream=新的SharpGIS.GZipInfrateStream(myResultStream);
现在,您可以像读取未压缩的流一样读取gzipStream。
然而,我真的不明白为什么不使用标准的http压缩,让服务器压缩所有内容,包括前300个字节。这对所有的小猫来说都更容易、更好。
您可以使用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) {...}