2012-02-10 27 views
4

我使用以下屬性來裝飾我的BaseController類。在ASP.NET MVC中壓縮內容文件3

public class OutputCompressAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; 
     if (string.IsNullOrEmpty(encodingsAccepted)) 
      return; 

     encodingsAccepted = encodingsAccepted.ToLowerInvariant(); 
     HttpResponseBase response = filterContext.HttpContext.Response; 

     if (encodingsAccepted.Contains("gzip")) 
     { 
      response.AppendHeader("Content-encoding", "gzip"); 
      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
     } 
     else if (encodingsAccepted.Contains("deflate")) 
     { 
      response.AppendHeader("Content-encoding", "deflate"); 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
     } 
    } 
} 

的問題是,儘管這只是正常的意見和每一個動作的結果,屬性不工作的東西,對項目的/Content文件夾。我想知道我該怎麼做才能使Content文件夾中的文件使用控制器,或者以某種方式綁定某些東西,或者讓我將這些過濾器附加到響應頭中。

回答

9

而不是編寫這樣的動作過濾器和重新發明輪子,你可以在IIS中activate compression。你可以爲靜態和動態內容做到這一點。

+0

但是你不能在web.config中設置它,對吧?你將如何在共享主機環境中設置壓縮? – frennky 2012-02-11 10:44:30

+4

@frennky,在這種情況下,您應該使用自定義HTTP模塊(IHttpModule)而不是操作篩選器。動作過濾器(如其名稱所暗示的)用於動作。如果您想手動壓縮靜態文件,請使用模塊。但爲了讓這個模塊被調用靜態資源,如圖像和JavaScript,你需要配置你的應用程序在集成管道模式下運行。 – 2012-02-11 12:04:31

+0

@Darin是否有用於GZip響應的HTTP模塊的示例? – bevacqua 2012-02-17 16:35:07