2009-07-22 26 views
53

Nếu hành động điều khiển có thuộc tính OutputCache xác định trên một hành động, có cách nào để xóa bộ đệm đầu ra mà không cần phải khởi động lại IIS?Làm thế nào để programmatically rõ ràng outputcache cho phương pháp hành động điều khiển

[OutputCache (Duration=3600,VaryByParam="param1;param2")] 
public string AjaxHtmlOutputMethod(string param1, string param2) 
{ 
    var someModel = SomeModel.Find(param1, param2); 

    //set up ViewData 
    ... 

    return RenderToString("ViewName", someModel); 
} 

Tôi đang xem xét sử dụng HttpResponse.RemoveOutputCacheItem(string path) để xóa nó, nhưng tôi đang gặp khó khăn để tìm ra những con đường nên để ánh xạ nó vào phương pháp hành động. Tôi sẽ thử lại với trang aspx được hiển thị bởi ViewName.

Có thể tôi sẽ tự chèn đầu ra của RenderToString vào số HttpContext.Cache thay vào đó nếu tôi không thể tìm ra kết quả này.

Cập nhật

Xin lưu ý rằng OutputCache là VaryByParam, và thử nghiệm ra một con đường mã hóa cứng "/ controller/action" không thực sự rõ ràng OutputCache, vì vậy nó có vẻ như nó có để phù hợp với "/ điều khiển/action/param1/param2 ".

Điều đó có nghĩa tôi có lẽ sẽ phải trở lại để phản đối mức bộ nhớ đệm và bộ nhớ cache bằng tay đầu ra cho RenderToString() :(

+0

Cố gắng thêm 'location =" Server "' vào thuộc tính OutputCache - bạn không thể xóa bộ nhớ cache của máy khách khỏi máy chủ –

Trả lời

48

Hãy thử điều này

var urlToRemove = Url.Action("AjaxHtmlOutputMethod", "Controller"); 
HttpResponse.RemoveOutputCacheItem(urlToRemove); 

CẬP NHẬT:

var requestContext = new System.Web.Routing.RequestContext(
    new HttpContextWrapper(System.Web.HttpContext.Current), 
    new System.Web.Routing.RouteData()); 

var Url = new UrlHelper(requestContext); 

CẬP NHẬT:

Hãy thử điều này:

[OutputCache(Location= System.Web.UI.OutputCacheLocation.Server, Duration=3600,VaryByParam="param1;param2")] 

Nếu việc xoá bộ nhớ cache sẽ không làm việc vì bạn đã cache đầu ra HTML trên máy tính của người dùng

+0

OK, tôi sẽ dùng thử này, cảm ơn! –

+0

Tất nhiên, bây giờ tôi đang gặp khó khăn trong việc tìm ra cách tạo một UrlHelper bên trong webservice có chức năng. Arg. –

+0

Tôi đã từ bỏ nỗ lực đó. Tôi không thể tìm thấy bất kỳ cách nào để có được RequestContext để vượt qua vào phương pháp xây dựng UrlHelper. Vì vậy, tôi đã thử nghiệm nó bằng cách viết mã cứng trong "/ controller/action". Điều này cho thấy không có lỗi, nhưng không xóa bộ nhớ cache. –

2

Một lựa chọn khác là sử dụng VaryByCustom cho OutputCache và xử lý các vô hiệu hóa các phần tử bộ nhớ cache nhất định tại đó.

Có lẽ nó làm việc cho bạn, nhưng nó không phải là một giải pháp chung cho vấn đề của bạn

3

Tôi nghĩ rằng dòng chảy đúng là:

filterContext.HttpContext.Response.Cache.SetNoStore() 
+0

Cảm ơn, đây là câu trả lời tốt hơn, bởi vì nó hoạt động cho tất cả các Địa điểm. Response.Cache.SetNoStore() – buffjape

1

Thêm mã để AjaxHtmlOutputMethod

HttpContext.Cache.Insert("Page", 1); 
Response.AddCacheItemDependency("Page"); 

Để xóa sản lượng bộ nhớ cache giờ đây bạn có thể sử dụng

HttpContext.Cache.Remove("Page"); 
3

Tiếp tục để câu trả lời được chấp nhận, để hỗ trợ các thông số VaryByParam:

[OutputCache (Duration=3600, VaryByParam="param1;param2", Location = OutputCacheLocation.Server)] 
    public string AjaxHtmlOutputMethod(string param1, string param2) 
    { 
     object routeValues = new { param1 = param1, param2 = param2 }; 

     string url = Url.Action("AjaxHtmlOutputMethod", "Controller", routeValues); 

     Response.RemoveOutputCacheItem(url); 
    } 

Tuy nhiên câu trả lời Egor là tốt hơn nhiều, bởi vì nó hỗ trợ tất cả các giá trị OutputCacheLocation:

[OutputCache (Duration=3600, VaryByParam="param1;param2")] 
    public string AjaxHtmlOutputMethod(string param1, string param2) 
    { 
     if (error) 
     { 
      Response.Cache.SetNoStore(); 
      Response.Cache.SetNoServerCaching(); 
     } 
    } 

Khi SetNoStore()SetNoServerCaching() được gọi là, họ ngăn chặn Yêu cầu hiện tại đang được lưu vào bộ nhớ cache.Các yêu cầu tiếp theo sẽ được lưu vào bộ nhớ cache, trừ khi các hàm được gọi cho các yêu cầu đó.

Điều này lý tưởng để xử lý các tình huống lỗi - khi bình thường bạn muốn lưu vào bộ nhớ cache, nhưng không phải nếu chúng chứa thông báo lỗi.

Các vấn đề liên quan