2011-01-11 36 views
8

Tôi đang sử dụng thuộc tính OutputCache trong trang web MVC của tôi như sau:Bypass OutputCache trong ASP.NET MVC

[OutputCache(Duration = 5000, 
     VaryByParam = "name;region;model;id;op;content;featured;isStarred;page;size;")] 

Tuy nhiên đôi khi tôi muốn bỏ qua bộ nhớ cache đầu ra hoàn toàn và buộc một lấy từ cơ sở dữ liệu. Điều này đặc biệt đúng với môi trường thử nghiệm của tôi, nơi tôi liên tục tải dữ liệu mới vào cơ sở dữ liệu để kiểm tra.

Tôi có thể bỏ qua bộ nhớ cache trong trường hợp này không?

Cảm ơn.

Trả lời

2

Tất cả những gì tôi cần sử dụng là phụ thuộc vào bộ nhớ cache. Tôi cần thay đổi này để được sửa đổi trong thời gian chạy, do đó, các tệp cấu hình không phải là một tùy chọn.

Thêm nội dung sau vào tác vụ tôi muốn bật tùy chọn "không có bộ nhớ cache".

Response.AddCacheItemDependency("Pages"); 

Và tạo hành động sau mà tôi có thể gọi để làm mới bộ nhớ cache.

public ActionResult RefreshCache() 
    { 
     HttpContext.Cache.Insert("Pages", DateTime.Now, null, 
           DateTime.MaxValue, TimeSpan.Zero, 
           CacheItemPriority.NotRemovable, 
           null); 
     Logger.Info("Cleansed cache"); 
     return RedirectToAction("HubContent"); 
    } 
10

Thay vì chỉ định tất cả các tham số bộ nhớ cache đầu ra của bạn, trong thuộc tính, bạn có thể sử dụng hồ sơ OutputCache.

Cấu hình bộ nhớ cache đầu ra cho phép bạn đặt tất cả các cài đặt bộ đệm đầu ra của bạn trong web.config, đặt tên cho hồ sơ và sau đó trỏ đến cấu hình đó từ thuộc tính của bạn.

Khi bạn đã thiết lập, bạn có thể thay đổi cài đặt trong web.config mà bạn sử dụng để gỡ lỗi để thời lượng bộ nhớ đệm chỉ còn 1 giây. Rõ ràng bạn sẽ rời khỏi tệp web.config sản xuất của mình với thời lượng lớn hơn nhiều.

Để biết thêm thông tin về cấu hình, kiểm tra http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx

+0

Bạn không thể làm điều đó cho partials. –

4

Nếu bạn muốn tắt nó đi hoàn toàn bạn có thể sử dụng

<caching> 
    <outputCache enableOutputCache="false" /> 
</caching> 

trong under.system.web web.config của bạn. Nếu bạn muốn làm điều đó từ mã (sử dụng một nút hay cái gì khác), bạn cũng có thể làm:

System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/"); 
System.Web.Configuration.OutputCacheSection cacheSection = (System.Web.Configuration.OutputCacheSection)config.GetSection("system.web/caching/outputCache"); 
cacheSection.EnableOutputCache = true/false; 
config.Save(); 

này sẽ lẽ chỉ làm việc trên máy dev của bạn. Hầu hết các máy chủ được thiết lập để không cho phép chỉnh sửa phần đó trong machine.config.

+1

sẽ không tắt nó là 'enableOutputCache =" false "'? – Maslow

+0

+1 6 tháng sau, ai đó đã bắt gặp lỗi sao chép và dán –

+0

Cảm ơn rất nhiều về đoạn mã - điều này khiến tôi dễ dàng thay đổi cài đặt để kiểm tra hiệu suất: -D – Oliver

1

này không chính xác trả lời câu hỏi của bạn, nhưng câu trả lời tiêu đề của bạn (mà không phải là "làm thế nào để xóa một mục từ bộ nhớ cache "): Bạn có thể thêm một" VaryByParam ":

[OutputCache(Duration=5000,VaryByParam="YourExistingParams;CacheBypass")] 

sau đó khi y Bạn muốn bỏ qua bộ nhớ cache, bạn chỉ cần chuyển thông số CacheBypass giá trị của DateTime.UtcNow.Ticks (hoặc bất kỳ điều ngẫu nhiên nào) => ví dụ: http://localhost/?CacheBypass=1234567890

+0

VaryByParam cũng lấy một ký tự đại diện ('*') để bạn không phải nhập vào tất cả các thông số của bạn. Điều này sẽ cache theo tham số BẤT K.. Sử dụng cẩn thận mặc dù '[OutputCache (Thời lượng = 5000, VaryByParam =" * ")]' – blockloop

+0

Tuyệt đối, nhưng hành vi này có thể không được mong muốn (đặc biệt nếu anh ta sử dụng theo dõi chuỗi truy vấn GA). Chú ý: như đã nêu, điều này không thực sự trả lời câu hỏi (nhưng trả lời tiêu đề) bởi vì nó không loại bỏ các mục từ bộ nhớ cache, ông sẽ là người duy nhất để xem các trang cập nhật. – Vincent