2013-06-26 75 views
18

我已經使用壓縮過濾器對我的MVC的行動一直爲這裏詳述:的Web API壓縮過濾器

http://msdn.microsoft.com/en-us/magazine/gg232768.aspx

我試圖重新利用代碼來執行的Web API類似的東西,但我碰到了一個障礙:

public class CompressAPIAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext) 
    { 
     var preferredEncoding = GetPreferredEncoding(filterContext.Request); 
     Stream compressedStream = null; 
     // Compress the response accordingly 
     var response = filterContext.Response; 
     response.Headers.Add("Content-encoding", preferredEncoding.ToString()); 

     if (preferredEncoding == CompressionScheme.Gzip) 
     { 
      response.Content = new GZipStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK 
     } 

     if (preferredEncoding == CompressionScheme.Deflate) 
     { 
      response.Content = new DeflateStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK 
     } 
     return; 
    } 

    enum CompressionScheme 
    { 
     Gzip = 0, 
     Deflate = 1, 
     Identity = 2 
    } 

    private CompressionScheme GetPreferredEncoding(HttpRequestMessage request) 
    { 
     var acceptableEncoding = request.Headers.AcceptEncoding; 

     if (acceptableEncoding.Where(h => h.Value.Contains("gzip")).Count() > 0) 
      return CompressionScheme.Gzip; 

     if (acceptableEncoding.Where(h => h.Value.Contains("deflate")).Count() > 0) 
      return CompressionScheme.Deflate; 

     return CompressionScheme.Identity; 
    } 

任何想法如何分配一個壓縮流到響應的內容?

我應該指出這是由IIS 6.0託管的,我不能控制它。

+2

在ASP.NET網頁API更好的方法是'DelegatingHandler'並已有一個答案描述解決方案http://stackoverflow.com/questions/10443588/mvc4-webapi-compress-get-method-response – tpeczek

+0

過濾器允許您只指定某些webapi操作...不DelegatingHandler強制您壓縮所有操作? –

回答

40

我想你應該做一個動作過濾器過濾的行動執行前的modelbinding階段發生,modelbinding格式化程序可以讀取流反序列化,在這種情況下,它會失敗時。

如果您使用的是IIS,然後執行以下步驟設置壓縮(以下從斯科特Hanselman的blog post一些片段):

  • 啓用IIS中的「動態壓縮」功能。

  • 返回到IIS管理器,請轉至SERVER的頁面,而不是站點。點擊配置編輯器: enter image description here

  • 從下拉列表中選擇system.webServer/httpCompression: enter image description here

  • 然後點擊動態類型,現在您在列表編輯器的時候,想想你的類型想壓縮。默認/是假的,但你可以打開它。我選擇了稍微挑剔,並添加application/atom + xml,application/json和application/atom + xml; charset = utf-8,如下所示。這是一個小問題,application/atom + xml和application/atom + xml; charset = utf-8是單獨的條目。隨意在這裏添加你喜歡的mimeTypes。 enter image description here
  • 你將他們加入,並關閉該對話框後,一定要點擊應用重新啓動你的IIS服務加載新的模塊。
  • 現在使用Accept-Encoding標題發出請求,您應該看到預期的響應。

  • EDIT(除了上述包括 「應用程序/ JSON;字符集= UTF-8」 爲涵蓋JSON格式)

+1

好東西!不幸的是,我在IIS 6.0上,無法控制服務器。 –

+1

注意:如果您沒有配置編輯器(像IIS 7中的我),只需從WebInstaller安裝管理包 – Kugel

+0

如果「Accept-Encoding:deflate」不適用於我。 – Artiom