簡體   English   中英

WP8 Gzip壓縮

[英]WP8 Gzip compression

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個未壓縮,但其他所有內容

我需要解壓縮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);”

任何幫助將非常感激

如果使用壓縮頭,則無需執行任何操作。 服務器壓縮,而客戶端自動解壓縮,您無需擔心任何事情。 但是,聽起來您正在使用一些專有的內容壓縮標准,而您僅壓縮了其中一些壓縮標准。 如果是這種情況,請不要在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個字節在內的所有內容。 對於那里的所有小貓來說,這要容易得多,更好。

您可以使用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) {...}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM