2009-12-22 47 views
4

我們這工作得很好很常見代碼:沖洗和壓縮過濾器(ASP.NET MVC)

public class CompressionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase request = filterContext.HttpContext.Request; 
     if (request.IsAjaxRequest()) 
      return; 

     string acceptEncoding = request.Headers["Accept-Encoding"]; 
     if (string.IsNullOrEmpty(acceptEncoding)) return; 
     acceptEncoding = acceptEncoding.ToUpperInvariant(); 
     HttpResponseBase response = filterContext.HttpContext.Response; 

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

現在我試圖用Response.Flush()頁面提供部分,以改善用戶體驗。 在這種情況下,當每個寫入操作修改了response.Filter時,顯然該頁面需要一次傳遞。 如何讓我的應用程序寫入中間流,然後壓縮它,然後推送到Response.Filter

+0

時髦,做了phpied博客帖子啓發你? :) – 2009-12-22 13:19:59

+0

不,只是「需要速度」...我的意思是應用程序的響應速度 – st78 2009-12-22 17:34:58

回答

1

到目前爲止,這似乎是不可解的,因爲輸入和輸出濾波器

-2

asp.net使用相同的流,我不認爲這是可行的,但如果你需要,以提高性能和用戶經驗,那麼你可以做以下事情:

1-使用IIS壓縮,不需要重新發明輪子 2-對輸出緩存使用其內容不會頻繁更改的操作。 3-使用局部渲染,您將首先輸出頁面中最重要的部分,然後發出Ajax請求以加載頁面內容的其餘部分,這樣您就可以以大塊形式提供頁面