2015-02-09 86 views
3

我一直在努力獲取有關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服務的壓縮響應有關的。很難知道,但如果這實際上是客戶端的工作。

+0

您是否曾經從ASP.Net Web API框架中獲得過任何這樣的工作?到目前爲止,我還沒有*運氣,返回一個gzip化的JSON響應 - Content-Encoding響應頭的值總是被這個無價值的API去除,無論我嘗試什麼,頭部總是被剝離掉。這個API是多麼可怕的一個例子。如果我在響應標題中添加了某些內容,那麼**將它獨自放在一邊!**。 – jerhewet 2015-02-26 18:05:08

+0

另一件事。請不要指向SO上的其他帖子,或者五年前在互聯網上的帖子。他們都沒有工作。所有這些都結束了內容編碼頭被剝離的響應。他們全部。 – jerhewet 2015-02-26 18:07:01

+0

不幸的是,我從來沒有超越你在這裏看到的。由於時間限制,我只好繼續前進。 – fhevol 2015-03-04 01:47:15

回答

3

如果有人不想閱讀所有評論,答案來自Jerry Hewett(jerhewet)。即防病毒軟件在到達瀏覽器之前攔截響應。毫無疑問,防病毒軟件將數據解壓縮爲掃描過程的一部分。非常感謝傑裏在這裏的幫助。

+0

防病毒對我來說也是個問題。非常感謝! – RaptisV 2017-03-27 11:42:15