2008-08-14 22 views
49

Para mi blog que estoy queriendo utilizar el caché de salida para guardar una versión en caché de un puesto perticular por alrededor de 10 minutos, y que ya está bien ...Compensación caché de página en ASP.NET

<%@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#?

Respuesta

45

que he encontrado la respuesta que estaba buscando:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx"); 
+0

¿Alguien sabe si algo como esto está disponible para ASP clásico? – Brettski

+0

No creo que el almacenamiento en caché esté disponible en ASP, así que no lo siento. – GateKiller

+0

Esto borra todos los cachés para cada params para esa página. – Salim

1

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 de blog real) como controles de usuario e implementar el almacenamiento parcial de la página en cada uno de esos controles de usuario.

1

Si cambia "*" sólo a los parámetros de la caché debe variar en usted puede hacer algo como esto (PostID?):

//add dependency 
string key = "post.aspx?id=" + PostID.ToString(); 
Cache[key] = new object(); 
Response.AddCacheItemDependency(key); 

y cuando alguien añade 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é.

5

Usando Response.AddCacheItemDependency para borrar todos los outputcaches.

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 utilizar en OutputCachedPage de ASP.NET MVC.

+0

Perfecto, eso es lo que estoy buscando. Solo hay una cosa que debes cambiar. HttpContext.Current.Cache.Remove (cacheKey); – Salim

1

¿por qué no utilizar sqlcachedependency en la tabla de publicaciones?

sqlcachedependency msdn

De esta manera el no implementar código de borrar la cache de encargo y simplemente actualizar la memoria caché como los cambios de contenido en el PP?

38

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"); 

Configuración:

protected void Application_Start() 
{ 
    HttpRuntime.Cache.Insert("Pages", DateTime.Now); 
} 

pequeño ajuste: tengo un ayudante que añade "flash" (mensajes Los mensajes de error, mensajes de éxito - "Este artículo ha sido 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.

limpieza de la caché:

HttpRuntime.Cache.Insert("Pages", DateTime.Now); 

Espero que esto ayude.

+3

Ir funciona solo para el almacenamiento en caché de toda la página. No funciona para acciones infantiles. ¿Alguna sugerencia? –

+3

and.maz ¿te diste cuenta de esto? –

+0

@ and.maz En caso de que descubriera cómo hacer esto para acciones de niños, hay una recompensa [aquí] (http://stackoverflow.com/q/5126751/63733). – marapet

0

HttpRuntime.Close() .. Trato de todo método y este es el único que el trabajo para mí

+6

sospecho que esto está cerrando el ASP. Proceso de solicitud NET en IIS. Esto parece un poco excesivo, probablemente borraría todos los cachés y tendría problemas significativos de rendimiento en sitios web grandes. – GateKiller

3

En el caso de carga de la página principal, por favor escriba el siguiente:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 

y en el botón de cierre de sesión clic:

Session.Abandon(); 
Session.Clear();