我一直在努力獲取有關Web API響應的gzip/deflate壓縮。我一直在使用Github - MessageHandlers.Compression的代碼。但它似乎沒有工作。在Google Developer Console或Firefox中的Firebug中沒有出現Content-Encoding標頭,並且Content-Length始終設置爲未壓縮的數據大小。所以我一直剝出代碼,直到我結束了以下內容:發送壓縮響應時的Web API問題
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// Send the request to the web api controller
var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
// Compress uncompressed responses from the server
if (response.Content != null && request.Headers.AcceptEncoding.IsNotNullOrEmpty())
{
var content = response.Content;
var bytes = content.ReadAsByteArrayAsync().Result;
if (bytes != null && bytes.Length > 1024)
{
// The data has already been serialised to JSon by this point
var compressedBytes = Compress(bytes);
response.Content = new ByteArrayContent(compressedBytes);
var headers = response.Content.Headers;
headers.Remove("Content-Type");
headers.ContentLength = compressedBytes.Length;
headers.ContentEncoding.Clear();
headers.ContentEncoding.Add("gzip");
headers.Add("Content-Type", "application/json");
}
}
return response;
}
private static byte[] Compress(byte[] input)
{
using (var compressStream = new MemoryStream())
{
using (var compressor = new GZipStream(compressStream, CompressionMode.Compress))
{
compressor.Write(input, 0, input.Length);
compressor.Close();
return compressStream.ToArray();
}
}
}
當我開始做這個,我犯了一個錯誤,並在報頭中設置的內容編碼爲「gzip的」當我用一個DeflateStream在壓縮方法。正如你所期望的那樣,我在瀏覽器中發現了一個錯誤,但是響應標頭是正確的(!)。也就是說,Content-Encoding標頭被設置並且Content-Length是正確的。同樣,查看原始數據,我可以清楚地看到是否被壓縮。只要我糾正了我的錯誤,但返回的問題。
我想知道的是瀏覽器的最新版本是否在後臺解壓縮內容,或者實際上是否存在我的代碼有問題?回覆以Json格式發送
任何幫助非常感謝。
編輯
我試圖在Global.asax中下面的方法傾銷頭日誌文件(在他們的日誌中出現的順序排列):
Application_PreSendRequestHeaders
Application_EndRequest
Application_PreSendRequestContent
在每種情況下,所需的標題都在那裏,即使它們沒有出現在Google開發者控制檯中。然後我看了一下Code Project的解決方案。當從命令行運行時,一切都按預期工作。然而,當我從Google Chrome調用Web服務器時,我得到了完全相同的結果。也就是說,沒有Content-Encoding標頭,也沒有關於內容是否被壓縮的指示。然而,在開發者控制檯打開的情況下,很容易在其他站點看到這個頭文件(例如堆棧溢出)。我必須假設這是與web api服務的壓縮響應有關的。很難知道,但如果這實際上是客戶端的工作。
您是否曾經從ASP.Net Web API框架中獲得過任何這樣的工作?到目前爲止,我還沒有*運氣,返回一個gzip化的JSON響應 - Content-Encoding響應頭的值總是被這個無價值的API去除,無論我嘗試什麼,頭部總是被剝離掉。這個API是多麼可怕的一個例子。如果我在響應標題中添加了某些內容,那麼**將它獨自放在一邊!**。 – jerhewet 2015-02-26 18:05:08
另一件事。請不要指向SO上的其他帖子,或者五年前在互聯網上的帖子。他們都沒有工作。所有這些都結束了內容編碼頭被剝離的響應。他們全部。 – jerhewet 2015-02-26 18:07:01
不幸的是,我從來沒有超越你在這裏看到的。由於時間限制,我只好繼續前進。 – fhevol 2015-03-04 01:47:15