2013-02-25 2 views
8

я хочу использовать G-ZIP на моем сайте, я гугле следующий код:ASP.NET MVC - Response.Filter равно нулю при использовании ActionFilterAttribute в RegisterGlobalFilters()

public class CompressAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"]; 
     if (!string.IsNullOrEmpty(acceptEncoding)) 
     { 
      acceptEncoding = acceptEncoding.ToLower(); 
      var 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); 
      } 
     } 
    } 
} 

Он отлично работает, когда я поставил атрибут Controller или Action.

[Compress] 
public class PostController : Controller 

Я не хочу, чтобы manully сделать это на каждый кусок кода, так что я зарегистрировал этот атрибут в

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new CompressAttribute()); 
} 

Но когда я запустить приложение, исключение пришел на эту строку кода:

response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 

ответ. Фильтр имеет значение null.

Я хочу знать, почему это происходит и как это решить. Благодаря!

- Обновление:

Я обнаружил, что исключение происходит только тогда, когда контроллер содержит ребенок действие, и это время вызова.

ответ

5

Моим решением было отфильтровать все дочерние действия.

if (filterContext.IsChildAction) return; 

Используйте этот код в верхней части вашего метода.

public class CompressAttribute : ActionFilterAttribute 
{  
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.IsChildAction) return; 

     ... 
    } 
} 
Смежные вопросы