2010-07-01 43 views
8

trong ứng dụng asp.net mvc của tôi Tôi đang sử dụng thuộc tính OutputCache trên phương thức hành động khác nhau. Có thể xem các mục nhập hiện tại trên bộ nhớ cache liên quan đến thuộc tính OutputCache không? Nếu tôi bị phạt trên System.Web.HttpContext.Current.Cache tôi không tìm thấy loại mục nhập này. Cảm ơn trước F.danh sách OutputCache nhập

+0

không ai có thể giúp tôi ??? – tartafe

Trả lời

10

Bộ nhớ cache đầu ra không thể truy cập công khai, do đó bạn sẽ không tìm thấy nó trong System.Web.HttpContext.Current.Cache. Trong ASP.NET 2 nó được chứa trong thành viên _caches của CacheInternal, mà bạn có thể đoán theo tên là một thành viên riêng của một lớp trừu tượng nội bộ. Có thể truy xuất nó với sự phản chiếu, mặc dù nó không phải là một nhiệm vụ dễ dàng. Ngoài ra nếu bạn truy xuất nó, bạn sẽ thấy rằng nó chứa tất cả các loại mục bộ nhớ cache nội bộ như bộ nhớ cache đường dẫn, bộ nhớ cache lớp được tạo động, khả năng di động, bộ nhớ cache phản hồi thô (đây là loại mục bộ nhớ cache đầu ra).

Giả sử bạn có thể lọc các mục có liên quan đến bộ nhớ cache đầu ra. Vấn đề là chúng không chứa nhiều thông tin có thể đọc được của con người ngoài phản hồi chính và nguyên (như mảng byte). Khóa thường bao gồm thông tin nếu phương thức GET (a1) hoặc POST (a2) tôi đã sử dụng, tên trang web, url tương đối gốc và hàm băm của các tham số phụ thuộc.

Tôi đoán đó là điểm đau phổ biến trong ASP.NET 4, một khái niệm mới về nhà cung cấp bộ đệm đầu ra tùy chỉnh đã được giới thiệu. Bạn có thể triển khai nhà cung cấp bộ nhớ cache đầu ra của riêng bạn kế thừa từ OutputCacheProvider và cung cấp một phương thức trả về tất cả các mục nhập. Bạn có thể xem bài viết này - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx. Cá nhân tôi đã không nhìn vào cơ sở hạ tầng OutputCache mới, vì vậy nếu bạn tìm thấy bất cứ điều gì nó sẽ là thú vị để viết về nó.

Đây là mã để truy xuất các mục nhập bộ nhớ cache nội bộ. Bạn có thể duyệt các giá trị của chúng trong khi gỡ lỗi trong Visual Studio:

Type runtimeType = typeof(HttpRuntime); 

PropertyInfo ci = runtimeType.GetProperty(
    "CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static); 

Object cache = ci.GetValue(ci, new object[0]); 

FieldInfo cachesInfo = cache.GetType().GetField(
    "_caches", 
    BindingFlags.NonPublic | BindingFlags.Instance); 
object cacheEntries = cachesInfo.GetValue(cache); 

List<object> outputCacheEntries = new List<object>(); 

foreach (Object singleCache in cacheEntries as Array) 
{ 
    FieldInfo singleCacheInfo = 
    singleCache.GetType().GetField("_entries", 
     BindingFlags.NonPublic | BindingFlags.Instance); 
    object entries = singleCacheInfo.GetValue(singleCache); 

    foreach (DictionaryEntry cacheEntry in entries as Hashtable) 
    { 
     FieldInfo cacheEntryInfo = cacheEntry.Value.GetType().GetField("_value", 
     BindingFlags.NonPublic | BindingFlags.Instance); 
     object value = cacheEntryInfo.GetValue(cacheEntry.Value); 
     if (value.GetType().Name == "CachedRawResponse") 
     { 
     outputCacheEntries.Add(value); 
     } 
    } 
} 
+0

Tôi sẽ thử vào thứ hai và cho bạn biết kết quả. Cảm ơn bạn. – Mauro

+0

Hi Branislav, có cách nào để lọc bộ nhớ cache để chỉ nhận các mục nhập của tôi không? Cảm ơn – Mauro

+0

Có, bạn có thể tìm thấy các mục nhập bộ nhớ cache đầu ra được thu thập trong danh sách outputCacheEntries. Đáng buồn thay không có nhiều để xem. Tuy nhiên tôi hy vọng nó sẽ giúp trường hợp của bạn. –

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