2013-02-25 13 views
8

Tôi muốn sử dụng G-ZIP trên trang web của tôi, tôi googled đoạn mã sau:ASP.NET MVC - Response.Filter là null khi sử dụng ActionFilterAttribute trong 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); 
      } 
     } 
    } 
} 

Nó hoạt động tốt khi tôi đặt thuộc tính cho Controller hoặc Action.

[Compress] 
public class PostController : Controller 

Tôi không muốn manully làm điều này trên mỗi đoạn mã, vì vậy tôi đã đăng ký thuộc tính này trong

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

Nhưng khi tôi chạy các ứng dụng, ngoại trừ được tung vào dòng mã này:

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

phản hồi.Filter is null.

Tôi muốn biết tại sao điều này xảy ra và cách giải quyết vấn đề này. Cảm ơn!

- Cập nhật:

tôi thấy rằng ngoại trừ chỉ xảy ra khi bộ điều khiển chứa một hành động trẻ em, và nó được gọi.

Trả lời

5

Giải pháp của tôi là lọc tất cả hành động của trẻ.

if (filterContext.IsChildAction) return; 

Sử dụng mã này ở đầu phương pháp của bạn.

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

     ... 
    } 
}