2009-12-22 51 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请求以加载页面内容的其余部分,这样您就可以以大块形式提供页面