2011-04-10 12 views
8

Próbowałem użyć metody opisanej tutaj ASP.NET MVC Action Filter - Caching and Compression. Na początku wyniki były zachęcające, a nawet serwer zaczął wysyłać zakodowane pliki GZip, ale po dalszych testach, czasami na stronach z częściami Html.RenderAction, atrybut ten byłby wywoływany dwa razy gziping na gzipowanej już stronie. Czy ktoś zna bardziej stabilną metodę wyświetlania skompresowanych stron za pomocą ASP.NET MVC 2 lub jakieś pomysły na modyfikowanie kodu, aby był bardziej ogólny?Kompresja GZip lub Deflate dla asp.net mvc 2 bez dostępu do konfiguracji serwera

public class CompressFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(FilterExecutingContext filterContext) 
    { 
     HttpRequestBase request = filterContext.HttpContext.Request; 
     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 GZipStream(response.Filter, CompressionMode.Compress); 
     } 
     else if (acceptEncoding.Contains("DEFLATE")) 
     { 
      response.AppendHeader("Content-encoding", "deflate"); 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
     } 
    } 

}

Odpowiedz

7

Można zignorować czynności podrzędne:

if (filterContext.IsChildAction) 
{ 
    return; 
} 
... 
+0

działa jak czar. Dziękuję Ci. – mrichana