2010-07-01 8 views
8

in meiner asp.net mvc-Anwendung verwende ich das OutputCache-Attribut auf andere Aktionsmethode. Ist es möglich, die aktuellen Einträge im Cache im Zusammenhang mit dem OutputCache-Attribut anzuzeigen? Wenn ich auf System.Web.HttpContext.Current.Cache bin, finde ich diese Art von Eintrag nicht. Vielen Dank im Voraus F.list OutputCache Eintrag

+0

niemand kann mir helfen ??? – tartafe

Antwort

10

Ausgabe-Cache ist nicht öffentlich zugänglich, so dass Sie es nicht in System.Web.HttpContext.Current.Cache finden. In ASP.NET 2 ist es in dem _caches Member CacheInternal enthalten, den Sie erraten können, indem der Name ein privates Mitglied einer internen abstrakten Klasse ist. Es ist möglich, es mit Reflexion zu erhalten, obwohl es keine leichte Aufgabe ist.

Auch wenn Sie es abrufen, werden Sie sehen, dass es alle Arten von internen Cache-Einträge wie Konfigurationsdateien Pfadcache, dynamisch generierten Klassen Cache, mobile Fähigkeiten, Raw Response-Cache enthält (dies ist der Typ der Ausgabe-Cache-Elemente).

Angenommen, Sie können die Elemente filtern, die sich auf den Ausgabecache beziehen. Das Problem ist, dass sie abgesehen von der Schlüssel- und RAW-Antwort (als Byte-Array) nicht viele vom Menschen lesbare Informationen enthalten. Der Schlüssel besteht im Allgemeinen aus Informationen, wenn die Methode GET (a1) oder POST (a2) verwendet wird, der Site-Name, die relative Wurzel-URL und der Hash der abhängigen Parameter.

Ich denke, es war ein üblicher Schwachpunkt, so dass in ASP.NET 4 ein neues Konzept von benutzerdefinierten Ausgabe-Cache-Anbietern eingeführt wurde. Sie können einen eigenen Output-Cache-Provider implementieren, der von OutputCacheProvider erbt, und eine Methode bereitstellen, die alle Einträge zurückgibt. Sie können diesen Artikel überprüfen - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx. Ich persönlich habe nicht in der neuen OutputCache-Infrastruktur nachgeschaut. Wenn Sie also etwas finden, wird es interessant sein, darüber zu schreiben.

Dies ist der Code zum Abrufen der internen Cache-Einträge. Sie können ihre Werte beim Debuggen in Visual Studio durchsuchen:

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

Ich werde es am Montag versuchen und Ihnen Ergebnisse sagen. Vielen Dank. – Mauro

+0

Hallo Branislav, gibt es eine Möglichkeit, den Cache zu filtern, um nur meine Einträge zu bekommen? Danke – Mauro

+0

Ja, Sie können die Ausgabe-Cache-Einträge finden, die in der outputCacheEntries-Liste gesammelt wurden. Leider gibt es nicht viel zu sehen. Trotzdem hoffe ich, es hilft Ihrem Fall. –

Verwandte Themen