6

Tôi có này bộ lọc tùy chỉnh cho nén đầu ra của các trang của tôi:OutputCache và một bộ lọc tùy chỉnh nén gzip

public class EnableCompressionAttribute : ActionFilterAttribute 
{ 
    const CompressionMode compress = CompressionMode.Compress; 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase request = filterContext.HttpContext.Request; 
     HttpResponseBase response = filterContext.HttpContext.Response; 
     string acceptEncoding = request.Headers["Accept-Encoding"]; 
     if (acceptEncoding == null) 
      return; 
     if (acceptEncoding.ToLower().Contains("gzip")) 
     { 
      response.Filter = new GZipStream(response.Filter, compress); 
      response.AppendHeader("Content-Encoding", "gzip"); 
     } 
     else if (acceptEncoding.ToLower().Contains("deflate")) 
     { 
      response.Filter = new DeflateStream(response.Filter, compress); 
      response.AppendHeader("Content-Encoding", "deflate"); 
     } 
    } 
} 

Tôi đã nhận mã từ cuốn sách: Pro ASP.NET MVC V2 Khung (Voice Expert tại. MẠNG LƯỚI).

Bây giờ tôi có một phương pháp hành động như thế này:

[OutputCache(Order=1, Duration=300,VaryByParam="*", VaryByContentEncoding="gzip; deflate")] 
[EnableCompression(Order=0)] 
public ActionResult About() 
{ 
    return View(); 
} 

Làm thế nào tôi có thể đảm bảo rằng các bộ lọc OutputCache là bộ nhớ đệm nội dung nén? Sử dụng thông số "Đặt hàng" như trong ví dụ này sẽ là đủ?

Làm cách nào để biết điều gì đang xảy ra trong bộ nhớ cache?

Chúc mừng.

CẬP NHẬT: Tôi đã thử nghiệm với Fiddler, dường như nó hoạt động cho dù bạn sử dụng thứ tự nào trên bộ lọc ... Tôi nhận được phản hồi đầu tiên với mã hóa gzip và http.302 trong các yêu cầu sau đây nếu khách hàng cho phép cache nó hoặc http.200 với mã hóa gzip nếu chỉ máy chủ được cho phép

Có thể điều này là do OutputCache là bộ lọc cuối theo mặc định và không có cách nào thay đổi điều đó. Có ai có thể xác nhận điều này?

Trả lời

4

Có một cái nhìn tại trang này, http://www.klopfenstein.net/lorenz.aspx/my-take-on-asp-net-output-caching Có một số thông tin tốt có đặc biệt Jeff Atwood's advice on compressing cache items

Từ trang này ..

thứ tự là quan trọng

Các ActionFilter trên hoàn toàn phải được chạy như cuối cùng : như tôi đã phát hiện gần đây, ngay khi bộ lọc hành động thay đổi kết quả hành động, lệnh gọi hành động hiện tại bị hủy bỏ. Điều này cũng có nghĩa là tất cả các bộ lọc hành động khác không có cơ hội chạy, sẽ không chạy, bao giờ hết. Nếu bạn dự định thêm phương thức lưu vào bộ nhớ đệm này vào dự án của mình, hãy đảm bảo rằng tất cả các bộ lọc đều có mức độ ưu tiên phù hợp (sử dụng thứ tự ưu tiên, có số nguyên dương và đơn đặt hàng từ thấp nhất đến cao nhất).