asp.net - control - outputcache mvc 5
lista entrada de OutputCache (1)
en mi aplicación asp.net mvc, estoy usando el atributo OutputCache en un método de acción diferente. ¿Es posible ver las entradas actuales en la memoria caché relacionadas con el atributo OutputCache? Si conecto en System.Web.HttpContext.Current.Cache
, no encuentro este tipo de entrada. Gracias de antemano F.
Output Cache no es de acceso público, por lo que no lo encontrará en System.Web.HttpContext.Current.Cache
. En ASP.NET 2 está contenido en el miembro de _caches
, que se puede adivinar por el nombre es un miembro privado de una clase abstracta interna. Es posible recuperarlo con reflexión, aunque no es una tarea fácil.
Además, si lo recupera, verá que contiene todo tipo de entradas de caché interna, como caché de ruta de archivos de configuración, caché de clases generadas dinámicamente, capacidades móviles, caché de respuesta sin formato (este es el tipo de elementos de caché de salida).
Supongamos que puede filtrar los elementos relacionados con la memoria caché de resultados. El problema es que no contienen mucha información legible por humanos aparte de la clave y la respuesta sin formato (como matriz de bytes). La clave generalmente consiste en información si utilicé el método GET (a1) o POST (a2), el nombre del sitio, la URL relativa a la raíz y el hash de los parámetros dependientes.
Supongo que era un punto común, por lo que en ASP.NET 4 se introdujo un nuevo concepto de proveedores de caché de salida personalizados. Puede implementar su propio proveedor de caché de salida heredando de OutputCacheProvider y proporcionar un método que devuelva todas las entradas. Puede consultar este artículo: http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx . Personalmente no he buscado en la nueva infraestructura de OutputCache, así que si encuentras algo, será interesante escribir sobre él.
Este es el código para recuperar las entradas de la memoria caché interna. Puede explorar sus valores mientras depura en 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);
}
}
}