2009-08-17 36 views
46

Có cách nào để vô hiệu hóa các phần của bộ đệm đầu ra ASP.NET MVC không? Những gì tôi muốn có thể làm là, nếu người dùng đăng dữ liệu thay đổi những gì sẽ được trả về từ một hành động được lưu trong bộ nhớ cache, có thể làm mất hiệu lực dữ liệu được lưu trong bộ nhớ cache đó.Làm thế nào để "vô hiệu hóa" các phần của bộ đệm đầu ra ASP.NET MVC?

Điều này có thể thực hiện được không?

+2

bạn đã tìm cách khắc phục? – Stefanvds

+0

Bản sao của: http://stackoverflow.com/questions/1200616/abort-outputcache-duration-programatically-in-asp-net-mvc và http://stackoverflow.com/questions/1167890/how-to-programmatically- clear-outputcache-for-controller-action-method –

Trả lời

39

Một cách là sử dụng phương pháp này:

HttpResponse.RemoveOutputCacheItem("/Home/About"); 

Một cách khác được mô tả ở đây: http://aspalliance.com/668

Tôi nghĩ rằng bạn có thể thực hiện phương pháp thứ hai bằng cách sử dụng một thuộc tính cấp độ phương pháp cho mỗi hành động mà bạn muốn và chỉ cần thêm vào nó chuỗi đại diện cho khóa. Đó là nếu tôi hiểu câu hỏi của bạn.

Chỉnh sửa: Có asp.net mvc OutputCache chỉ là trình bao bọc.

Nếu bạn đang sử dụng varyByParam="none" thì bạn chỉ vô hiệu hóa "/Statistics" - đó là nếu <id1>/<id2> là giá trị chuỗi truy vấn. Điều này sẽ làm mất hiệu lực tất cả các phiên bản của trang.

Tôi đã làm một bài kiểm tra nhanh và nếu bạn thêm varyByParam="id1" và sau đó tạo nhiều phiên bản của trang - nếu bạn nói invalidate invalidate "/Statistics/id1" nó sẽ làm mất hiệu lực chỉ phiên bản đó. Nhưng bạn nên làm các xét nghiệm thêm.

+1

là thuộc tính MVC OutputCache chỉ là một trình bao bọc xung quanh bộ nhớ đệm đầu ra ASP.NET thông thường?Vì vậy, giả sử tôi muốn vô hiệu hóa kết quả cho một hành động có tên là "/ Statistics//" Tôi chỉ gọi HttpResponse.RemoveOutputCacheItem ("/ Statistics//")? FWIW, thuộc tính "VaryByParams" của thuộc tính là "Không". Tôi có sử dụng tài sản đó một cách chính xác không? –

+0

@Matthew Belk: Bạn có sử dụng kỹ thuật này cuối cùng không? Đã làm mất hiệu lực của một mục bộ nhớ cache theo param làm việc như mong đợi? cảm ơn. – UpTheCreek

+0

Tôi khuyên bạn nên sử dụng MvcDonutCaching, thông tin thêm có tại đây http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3 –

1

Tôi đã thực hiện một số kiểm tra về bộ nhớ đệm. Đây là những gì tôi tìm thấy:

Bạn phải xóa bộ nhớ cache cho mọi tuyến đường dẫn đến hành động của bạn. Nếu bạn có 3 tuyến dẫn đến hành động tương tự chính xác trong bộ điều khiển của mình, bạn sẽ có một bộ nhớ cache cho mỗi tuyến đường.

Hãy nói rằng, tôi có cấu hình tuyến đường này:

routes.MapRoute(
       name: "config1", 
       url: "c/{id}", 
       defaults: new { controller = "myController", action = "myAction", id = UrlParameter.Optional } 
       ); 

      routes.MapRoute(
       name: "Defaultuser", 
       url: "u/{user}/{controller}/{action}/{id}", 
       defaults: new { controller = "Accueil", action = "Index", user = 0, id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Accueil", action = "Index", id = UrlParameter.Optional } 
      ); 

Sau đó, những 3 tuyến đường dẫn đến myAction trong myController với param myParam:

  1. http://example.com/c/myParam
  2. http://example.com/myController/myAction/myParam
  3. http://example.com/u/0/myController/myAction/myParam

Nếu hành động của tôi là như sau

public class SiteController : ControllerCommon 
    { 

     [OutputCache(Duration = 86400, VaryByParam = "id")] 
     public ActionResult Cabinet(string id) 
     { 
      return View(); 
} 
} 

tôi sẽ có một bộ nhớ cache cho mỗi tuyến đường (trong trường hợp này 3). Do đó, tôi sẽ phải làm mất hiệu lực mọi tuyến đường.

Như thế này

private void InvalidateCache(string id) 
     { 
      var urlToRemove = Url.Action("myAction", "myController", new { id}); 
      //this will always clear the cache as the route config will create the path 
      Response.RemoveOutputCacheItem(urlToRemove); 
      Response.RemoveOutputCacheItem(string.Format("/myController/myAction/{0}", id)); 
      Response.RemoveOutputCacheItem(string.Format("/u/0/myController/myAction/{0}", id)); 
     } 
Các vấn đề liên quan