2010-07-01 7 views
8

nella mia applicazione asp.net mvc sto usando l'attributo OutputCache su diversi metodi di azione. È possibile visualizzare le voci correnti sulla cache relative all'attributo OutputCache? Se cito su System.Web.HttpContext.Current.Cache non trovo questo tipo di voce. Grazie in anticipo F.lista OutputCache voce

+0

nessuno può aiutarmi ??? – tartafe

risposta

10

Output Cache non è pubblicamente accessibile, quindi non lo troverai in System.Web.HttpContext.Current.Cache. In ASP.NET 2 è contenuto nel membro di CacheInternal, che si può intuire dal nome è un membro privato di una classe astratta interna. È possibile recuperarlo con la riflessione, anche se non è un compito facile.

anche se si recupera lo vedrai che contiene tutti i tipi di voci di cache interne come i file di configurazione della cache percorso, cache delle classi generati dinamicamente, funzionalità mobili, cache di risposta prima (questo è il tipo degli elementi della cache di uscita).

Si supponga di poter filtrare gli elementi relativi alla cache di output. Il problema è che non contengono molte informazioni leggibili dall'uomo oltre alla chiave e alla risposta grezza (come array di byte). La chiave generalmente consiste in informazioni se si utilizza il metodo GET (a1) o POST (a2), il nome del sito, l'url relativo alla radice e l'hash dei parametri dipendenti.

Suppongo che fosse un punto dolente comune, quindi in ASP.NET 4 è stato introdotto un nuovo concetto di provider di cache di output personalizzati. È possibile implementare il proprio provider di cache di output ereditato da OutputCacheProvider e fornire un metodo che restituisce tutte le voci. Puoi dare un'occhiata a questo articolo - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx. Personalmente non ho guardato nella nuova infrastruttura di OutputCache, quindi se trovi qualcosa sarà interessante scriverne.

Questo è il codice per recuperare le voci della cache interna. Puoi sfogliare i loro valori durante il debug in 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

Ci proverò lunedì e ti dirò i risultati. Grazie. – Mauro

+0

Ciao Branislav, c'è un modo per filtrare la cache al fine di ottenere solo le mie voci? Grazie – Mauro

+0

Sì, è possibile trovare le voci della cache di output raccolte nell'elenco outputCacheEntries. Purtroppo non c'è molto da vedere. Tuttavia spero che aiuti il ​​tuo caso. –

Problemi correlati