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
Antwort
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);
}
}
}
Ich werde es am Montag versuchen und Ihnen Ergebnisse sagen. Vielen Dank. – Mauro
Hallo Branislav, gibt es eine Möglichkeit, den Cache zu filtern, um nur meine Einträge zu bekommen? Danke – Mauro
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. –
niemand kann mir helfen ??? – tartafe