2010-07-01 4 views
8

dans mon application mvc asp.net J'utilise l'attribut OutputCache sur une méthode d'action différente. Est-il possible d'afficher les entrées actuelles sur le cache liées à l'attribut OutputCache? Si je cicle sur System.Web.HttpContext.Current.Cache je ne trouve pas ce type d'entrée. Merci d'avance F.liste Entrée OutputCache

+0

Personne ne peut m'aider ??? – tartafe

Répondre

10

Cache de sortie n'est pas accessible au public, donc vous ne le trouverez pas dans System.Web.HttpContext.Current.Cache. Dans ASP.NET 2, il est contenu dans le membre _caches de CacheInternal, que vous pouvez deviner par son nom est un membre privé d'une classe abstraite interne. Il est possible de le récupérer avec réflexion, même si ce n'est pas une tâche facile. En outre, si vous le récupérez, vous verrez qu'il contient toutes sortes d'entrées de cache internes comme les fichiers de configuration, le cache de chemin, le cache de classe généré dynamiquement, les capacités mobiles, le cache de réponse brut.).

Disons que vous pouvez filtrer les éléments liés au cache de sortie. Le problème est qu'ils ne contiennent pas beaucoup d'informations lisibles par l'homme en dehors de la réponse clé et brute (comme tableau d'octets). La clé est généralement constituée d'informations si la méthode GET (a1) ou POST (a2) est utilisée, le nom du site, l'URL relative racine et le hachage des paramètres dépendants.

Je suppose que c'était un point commun, alors dans ASP.NET 4, un nouveau concept de fournisseurs de cache de sortie personnalisés a été introduit. Vous pouvez implémenter votre propre fournisseur de cache de sortie héritant de OutputCacheProvider et fournir une méthode qui renvoie toutes les entrées. Vous pouvez consulter cet article - http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx. Personnellement, je n'ai pas regardé dans la nouvelle infrastructure OutputCache, donc si vous trouvez quelque chose, il sera intéressant d'écrire à ce sujet.

Il s'agit du code permettant de récupérer les entrées de cache internes. Vous pouvez parcourir leurs valeurs lors du débogage dans 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

Je vais essayer le lundi et vous donner des résultats. Je vous remercie. – Mauro

+0

Salut Branislav, y a-t-il un moyen de filtrer le cache pour obtenir seulement mes entrées? Merci – Mauro

+0

Oui, vous pouvez trouver les entrées de cache de sortie rassemblées dans la liste outputCacheEntries. Malheureusement, il n'y a pas grand chose à voir. Néanmoins, j'espère que cela aidera votre cas. –

Questions connexes