c# - Borrando la memoria caché de la página en ASP.NET
outputcache (8)
¿por qué no usar sqlcachedependency en la tabla de publicaciones?
De esta forma, ¿no está implementando código de borrado de caché personalizado y simplemente refrescando el caché a medida que el contenido cambia en el archivo db?
Para mi blog, quiero usar Output Cache para guardar una versión en caché de una publicación perticular por alrededor de 10 minutos, y eso está bien ...
<%@OutputCache Duration="600" VaryByParam="*" %>
Sin embargo, si alguien publica un comentario, quiero borrar el caché para que la página se actualice y se pueda ver el comentario.
¿Cómo hago esto en ASP.Net C #?
En el evento de carga de página maestra, escriba lo siguiente:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
y en el botón de cerrar sesión, haga clic en:
Session.Abandon();
Session.Clear();
Encontré la respuesta que estaba buscando:
HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
Hmm. Puede especificar un atributo VaryByCustom en el elemento OutputCache. El valor de esto se pasa como un parámetro del método GetVaryByCustomString que puede implementar en global.asax. El valor devuelto por este método se utiliza como índice en los elementos almacenados en caché; si devuelve el número de comentarios en la página, por ejemplo, cada vez que se agrega un comentario, se almacenará en caché una página nueva.
La advertencia de esto es que esto no borra la memoria caché. Si una entrada de blog recibe un gran uso de comentarios, tu caché podría explotar en tamaño con este método.
Alternativamente, podría implementar los bits no modificables de la página (la navegación, los anuncios, la entrada real del blog) como controles del usuario e implementar el almacenamiento en caché parcial de la página en cada uno de esos controles del usuario.
Lo anterior está bien si sabe para qué páginas quiere borrar el caché. En mi caso (ASP.NET MVC) hice referencia a los mismos datos de todas partes. Por lo tanto, cuando hice [guardar] quise borrar todo el sitio de caché. Esto es lo que funcionó para mí: http://aspalliance.com/668
Esto se hace en el contexto de un filtro OnActionExecuting. Lo mismo podría hacerse anulando OnActionExecuting en un BaseController o algo así.
HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");
Preparar:
protected void Application_Start()
{
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}
Minor Tweak: tengo un helper que agrega "mensajes flash" (mensajes de error, mensajes de éxito - "Este elemento se ha guardado con éxito", etc.). Para evitar que aparezca el mensaje flash en cada GET subsiguiente, tuve que invalidar después de escribir el mensaje flash.
Limpiando Caché:
HttpRuntime.Cache.Insert("Pages", DateTime.Now);
Espero que esto ayude.
Si cambia "*" a solo los parámetros, la memoria caché debería variar (¿Id. Posterior?) Puede hacer algo como esto:
//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);
y cuando alguien agrega un comentario ...
Cache.Remove(key);
Supongo que esto funcionaría incluso con VaryByParam *, ya que todas las solicitudes estarían vinculadas a la misma dependencia de caché.
Utilizando Response.AddCacheItemDependency para borrar todas las cadenas de salida.
public class Page : System.Web.UI.Page
{
protected override void OnLoad(EventArgs e)
{
try
{
string cacheKey = "cacheKey";
object cache = HttpContext.Current.Cache[cacheKey];
if (cache == null)
{
HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
}
Response.AddCacheItemDependency(cacheKey);
}
catch (Exception ex)
{
throw new SystemException(ex.Message);
}
base.OnLoad(e);
}
}
// Clear All OutPutCache Method
public void ClearAllOutPutCache()
{
string cacheKey = "cacheKey";
HttpContext.Cache.Remove(cacheKey);
}
Esto también se puede usar en OutputCachedPage de ASP.NET MVC.
HttpRuntime.Close()
.. Intento todo el método y este es el único que funciona para mí