2010-07-01 20 views
8

w mojej aplikacji mvc asp.net używam atrybutu OutputCache w różnych metodach działania. Czy można wyświetlić bieżące wpisy w pamięci podręcznej związane z atrybutem OutputCache? Jeśli nie mogę znaleźć tego typu wpisu, to na System.Web.HttpContext.Current.Cache. Z góry z góry F.list OutputCache wpis

+0

Nikt nie może mi pomóc ??? – tartafe

Odpowiedz

10

Wyjście Cache nie jest publicznie dostępne, więc nie można go znaleźć w System.Web.HttpContext.Current.Cache. W ASP.NET 2 jest on zawarty w członku , który można odgadnąć, ponieważ jest to prywatny element wewnętrznej klasy abstrakcyjnej. Można go odzyskać za pomocą odbicia, ale nie jest to łatwe zadanie.

Również jeśli go pobierzesz zobaczysz, że zawiera on wszystkie rodzaje wewnętrznych wpisów w pamięci podręcznej, takich jak pamięć podręczna ścieżek plików konfiguracyjnych, dynamicznie generowane pamięci podręczne klas, możliwości mobilne, pamięć podręczna surowych odpowiedzi (ta jest typem wyjściowych pozycji pamięci podręcznej;).

Załóżmy, że możesz filtrować pozycje związane z wyjściową pamięcią podręczną. Problem polega na tym, że nie zawierają one wielu czytelnych dla człowieka informacji poza kluczową i surową odpowiedzią (jako tablicą bajtów). Klucz zazwyczaj składa się z informacji, których użyłem, jeśli użyto metody GET (a1) lub POST (a2), nazwy strony, względnego adresu URL root i skrótu zależnych parametrów.

Domyślam się, że był to typowy problem związany z bólem, więc w ASP.NET 4 wprowadzono nową koncepcję niestandardowych dostawców bufora wyjściowego. Możesz zaimplementować własnego dostawcę pamięci podręcznej wyjściowego dziedzicząc z OutputCacheProvider i zapewnić metodę zwracającą wszystkie wpisy. Możesz sprawdzić ten artykuł - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx. Osobiście nie zajrzałem do nowej infrastruktury OutputCache, więc jeśli znajdziesz cokolwiek, będzie ciekawiej o tym napisać.

To jest kod do pobierania wpisów wewnętrznej pamięci podręcznej. Możesz przeglądać ich wartości podczas debugowania w 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

Postaram się wypróbować w poniedziałek i powiedzieć ci wyniki. Dziękuję Ci. – Mauro

+0

Witam Branislav, czy istnieje sposób na filtrowanie pamięci podręcznej, aby uzyskać tylko moje wpisy? Dzięki – Mauro

+0

Tak, możesz znaleźć wpisy bufora wyjściowego zebrane na liście outputCacheEntries. Niestety nie ma wiele do zobaczenia. Niemniej jednak mam nadzieję, że pomoże to Twojej sprawie. –