asp.net - mvc - ¿Hay alguna manera de borrar/eliminar/eliminar OutputCache?
net core cache (6)
Al inspirarse en otra publicación, el siguiente fragmento elimina con éxito cada página almacenada en caché por OutputCache
en asp.net utilizando reflection:
public static void ClearOutputCache()
{
var runtimeType = typeof(HttpRuntime);
var ci = runtimeType.GetProperty(
"CacheInternal",
BindingFlags.NonPublic | BindingFlags.Static);
var cache = ci.GetValue(ci, new object[0]);
var cachesInfo = cache.GetType().GetField(
"_caches",
BindingFlags.NonPublic | BindingFlags.Instance);
var cacheEntries = cachesInfo.GetValue(cache);
var outputCacheEntries = new List<object>();
foreach (Object singleCache in cacheEntries as Array)
{
var singleCacheInfo =
singleCache.GetType().GetField("_entries",
BindingFlags.NonPublic | BindingFlags.Instance);
var entries = singleCacheInfo.GetValue(singleCache);
foreach (DictionaryEntry cacheEntry in entries as Hashtable)
{
var cacheEntryInfo = cacheEntry.Value.GetType().GetField("_value",
BindingFlags.NonPublic | BindingFlags.Instance);
var value = cacheEntryInfo.GetValue(cacheEntry.Value);
if (value.GetType().Name == "CachedRawResponse")
{
var key = (string)cacheEntry.Value.GetType().BaseType.GetField("_key", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(cacheEntry.Value);
key = key.Substring(key.IndexOf("/"));
outputCacheEntries.Add(key);
}
}
}
foreach (string key in outputCacheEntries)
{
HttpResponse.RemoveOutputCacheItem(key);
}
}
Estoy usando OutputCache en mi control webuser (.ascx)
<%@ OutputCache Duration="1000" VaryByParam="none" %>
Me gustaría conservar el caché durante los próximos 1000 segundos, pero cuando se carga una página específica en mi sitio, me gustaría eliminar / vaciar / actualizar el caché. Al igual que, quiero borrar la caché cuando se carga MyPage.aspx. ¿Puedo lavar el caché programéticamente?
Su única página es el caché, por lo que no hay versiones paramatrizadas para vaciar el caché.
Gracias por su ayuda con anticipación.
Es un poco machacante descifrar una especie de aproximación a las tuercas, pero fue la forma más simple y efectiva de borrar completamente el caché de una aplicación que encontré.
Simplemente llame:
HttpRuntime.UnloadAppDomain();
Esto tiene el mismo impacto que reciclar el grupo de aplicaciones. No es adecuado en todas las situaciones, pero definitivamente hará el trabajo.
Puede usar HttpResponse.RemoveOutputCacheItem
o HttpResponse.AddCacheItemDependency
para invalidar las entradas de la memoria caché de resultados.
Puede usar el parámetro VaryByCustom
para esto.
En su control de usuario, tendría lo siguiente:
<%@ OutputCache Duration="1000" VaryByParam="None" VaryByCustom="MyKey" %>
Luego, anularía el método GetVaryByCustomString
en su Global.asax de la siguiente manera:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "MyKey")
{
object o = context.Current.Application["MyGuid"];
if (o == null)
{
o = Guid.NewGuid();
context.Current.Application["MyGuid"] = o;
}
return o.ToString();
}
return base.GetVaryByCustomString(context, arg);
}
Finalmente en MyPage.aspx
harías esto:
Application["MyGuid"] = Guid.NewGuid();
¿Como funciona esto?
Siempre que su control se almacena en caché, se asocia con una cadena (la cadena devuelta por el método GetVaryByCustomString
cuando se VaryByCustom
clave VaryByCustom
su control).
Cada vez que se usa el control posteriormente, se llama nuevamente a GetVaryByCustomString
. Si la cadena devuelta coincide con una versión en caché del control, se utiliza la versión en caché.
En nuestro caso, "MyKey" se pasa a GetVaryByCustomString
y devuelve lo que está almacenado en la Application["MyGuid"]
.
Siempre que se llame a Application["MyGuid"]
, cambiará Application["MyGuid"]
a un nuevo valor aleatorio.
Cuando se use su control a continuación, el método GetVaryByCustomString
devolverá el nuevo valor y, dado que no hay una versión en caché del control asociado con ese valor, el control se regenerará. (El control se almacenará en caché y se asociará con el nuevo valor, para persistir hasta la próxima llamada a MyPage.aspx
etc.)
Hay una descripción general here .
puede agregar HttpResponse.RemoveOutputCacheItem ("/ YourCachePageName.aspx"); línea de código en el evento de carga de página de la página, cuya carga se espera que el caché de la página en caché se apague.
Editar: si ha habilitado el almacenamiento en memoria caché del kernel en II6 +, deberá seguir el consejo de Luke y usar un encabezado VaryByCustom, ya que borrar el caché de ASP.NET no afectará la memoria caché del kernel.
OutputCache se almacena en ASP.NET Cache, por lo que solo puede llamar a Cache.Remove:
List<string> keys = new List<string>();
foreach(string key in HttpRuntime.Cache)
{
keys.Add(key);
}
foreach(string key in keys)
{
Cache.Remove(key);
}
Sin embargo, esto eliminará TODAS las entradas de caché, incluidas las entradas personalizadas agregadas por su código.