11

Tôi đã nhìn thấy một số tùy chọn để thêm GZIP/DEFLATE nén vào đầu ra ASP.Net MVC, nhưng tất cả dường như áp dụng nén khi đang chạy .. do đó không đưa advange của bộ nhớ đệm nội dung nén.ASP.NET MVC - nén + caching

Bất kỳ giải pháp nào để bật bộ nhớ đệm của đầu ra trang được nén? Tốt hơn là trong mã, để mã MVC có thể kiểm tra xem trang có thay đổi hay không, và gửi đi nội dung được lưu trong bộ nhớ đệm được nén trước nếu không.

Câu hỏi này thực sự có thể áp dụng cho asp.net thông thường.

+0

Bạn có nghĩa là lưu vào bộ đệm phản hồi nén trong 'System.Web.Cache'? – bzlm

+0

Có lẽ, hoặc bất kỳ giải pháp nào khác thực hiện việc này. –

+0

Không có câu trả lời nào cho đến nay, trong khi thông tin ở các khía cạnh khác, dường như giải quyết nội dung nén _in_ bộ nhớ cache so với nội dung _served from_ bộ nhớ cache. Suy nghĩ về một bản trình bày UG trên bộ nhớ đệm ASP.NET, bạn đã cân nhắc viết một nhà cung cấp bộ nhớ cache tùy chỉnh chưa? – J0e3gan

Trả lời

4
[Compress] 
[OutputCache(Duration = 600, VaryByParam = "*", VaryByContentEncoding="gzip;deflate")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+2

Bất kỳ tài liệu nào về điều này? trông giống như những gì Im sau. –

+0

Tôi rất muốn xem thêm thông tin về điều này, tôi đã không thể làm cho công việc "nén" attrib –

0

Bạn có thể tạo một thuộc tính Cache:

public class CacheAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 

     if (Enabled) 
     { 
      cache.SetExpires(System.DateTime.Now.AddDays(30)); 
     } 
     else 
     { 
      cache.SetCacheability(HttpCacheability.NoCache); 
      cache.SetNoStore(); 
     } 
    } 

    public bool Enabled { get; set; } 

    public CacheAttribute() 
    { 
     Enabled = true; 
    } 
} 
+0

Làm thế nào để xử lý nén này? –

+0

Xin lỗi, đã hiểu lầm một phần của câu hỏi. Bạn có thể kiểm tra điều này http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx. Nó vẫn đang thực hiện việc nén, nhưng thuộc tính của nó cho bạn nhiều lựa chọn và lựa chọn hơn là giải pháp toàn máy chủ. –

3

Sử dụng tùy chọn bộ nhớ đệm bằng cách sử dụng thuộc tính (cho MVC) và không nghĩ về nén vì IIS/IISExpress tự động nén đầu ra của bạn nếu bạn bật nó.

cách hoạt động, mvc không cho phép lưu vào bộ nhớ cache của các đoạn riêng lẻ hoặc các phần của đầu ra (bộ đệm nội dung một phần). nếu bạn muốn điều này, hãy cân nhắc sử dụng một dịch vụ như CloudFlare (có bất kỳ dịch vụ nào khác như CF không?). nó tự động lưu trữ dữ liệu đầu ra của bạn và lưu trữ các phần của đầu ra của bạn và cung cấp nhiều cải tiến hiệu suất và bảo mật khác, tất cả đều không có thay đổi trong mã của bạn.

Nếu đây không phải là tùy chọn cho bạn, thì bạn vẫn có thể sử dụng IISpeed ​​(nó là cổng IIS của mod_pagespeed của Google). Nó cung cấp một số cài đặt thú vị như loại bỏ khoảng trắng, nén nội tuyến và nén js, trộn tệp js và nhiều cài đặt khác.

Cả CF và IISpeed ​​đều không quan tâm đến cách trang web của bạn được xây dựng, chúng hoạt động trên cấp http/html, vì vậy cả hai đều hoạt động trên MVC, ASP.NET cổ điển, php hoặc thậm chí các tệp html thô.

+1

lần cuối cùng, hãy cẩn thận khi bạn sử dụng 'Vary' vì nó có thể phá vỡ hoạt động bộ nhớ đệm của một số phiên bản IE cũ. – edokan

1

Bạn có thể tạo một thuộc tính như

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; 
     else 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"); 
     } 
    } 
} 

Thêm mục trong Global.asax.cs

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

Sau đó, bạn có thể sử dụng thuộc tính này như:

[EnableCompression] 
    public ActionResult WithCompression() 
    { 
     ViewBag.Content = "Compressed"; 
     return View("Index"); 
    } 

Bạn có thể tải xuống ví dụ làm việc từ Github: https://github.com/ctesene/TestCompressionActionFilter

+0

Điều này hỗ trợ ** caching ** phiên bản nén của trang thay vì recompressing mỗi yêu cầu? – AaronLS

+0

Có, thuộc tính được áp dụng cho phương thức điều khiển do đó "phản hồi" được nén từ phía máy chủ. Tôi không hiểu ý bạn là "nén lại yêu cầu". –

+0

Có hay không nén xảy ra trên mọi yêu cầu và do đó không hiệu quả: "Yêu cầu đã nhận-> Truy xuất trang được lưu trong bộ nhớ cache-> Nén trang được lưu trong bộ nhớ cache", so với trang "Yêu cầu đã nhận-> Truy xuất được lưu trong bộ nhớ cache (đã được nén)". – AaronLS

1

Điều này link có vẻ khá gần với những gì bạn yêu cầu. Nó lưu trữ các trang được tạo động nén. Mặc dù ví dụ sử dụng biểu mẫu Web, nó có thể được điều chỉnh theo MVC bằng cách sử dụng thuộc tính OutputCache

[OutputCache(Duration = 600, VaryByParam = "*", VaryByContentEncoding="gzip;deflate")] 
Các vấn đề liên quan