2009-08-17 11 views
46

¿Hay alguna forma de invalidar mediante programación partes de la memoria caché de salida MVC de ASP.NET? Lo que me gustaría poder hacer es, si un usuario publica datos que cambian lo que se devolvería de una acción almacenada en caché, poder invalidar esos datos en caché.Cómo "invalidar" partes de la memoria caché de salida ASP.NET MVC?

¿Esto es posible?

+2

has encontrado una solución? – Stefanvds

+0

Duplicado de: http://stackoverflow.com/questions/1200616/abort-outputcache-duration-programatically-in-asp-net-mvc y http://stackoverflow.com/questions/1167890/how-to-programmatic- clear-outputcache-for-controller-action-method –

Respuesta

39

Una forma es utilizar el método:

HttpResponse.RemoveOutputCacheItem("/Home/About"); 

se describe Otra forma aquí: http://aspalliance.com/668

Creo que se podría aplicar el segundo método mediante el uso de un atributo de nivel de método para cada acción que desea y solo agrega la cadena que representa la clave. Eso es si entendí tu pregunta.

Edit: Sí, el asp.net mvc OutputCache es solo un contenedor.

Si está utilizando varyByParam="none", entonces simplemente invalida "/Statistics" - eso es si <id1>/<id2> son valores de la cadena de consulta. Esto invalidará todas las versiones de la página.

Hice una prueba rápida y si agrega varyByParam="id1" y luego crea múltiples versiones de la página - si dice invalidar invalidar "/Statistics/id1" invalidará solo esa versión. Pero deberías hacer más pruebas.

+1

es el atributo MVC OutputCache solo un contenedor alrededor del almacenamiento en caché de ASP.NET habitual?Entonces, digamos que quería invalidar los resultados de una acción llamada "/ Statistics//" Simplemente me gustaría llamar a HttpResponse.RemoveOutputCacheItem ("/ Statistics//")? FWIW, la propiedad "VaryByParams" del atributo es "Ninguno". ¿Estoy usando esa propiedad correctamente? –

+0

@Matthew Belk: ¿Usaste esta técnica al final? ¿La invalidación de un elemento de caché por param funciona como se esperaba? Gracias. – UpTheCreek

+0

Recomendaría usar MvcDonutCaching, más información disponible aquí http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3 –

1

Hice algunas pruebas sobre el almacenamiento en caché. Esto es lo que encontré:

Tienes que borrar el caché para cada ruta que conduzca a tu acción. Si tiene 3 rutas que conducen exactamente a la misma acción en su controlador, tendrá un caché para cada ruta.

Digamos, tengo esta ruta config:

routes.MapRoute(
       name: "config1", 
       url: "c/{id}", 
       defaults: new { controller = "myController", action = "myAction", id = UrlParameter.Optional } 
       ); 

      routes.MapRoute(
       name: "Defaultuser", 
       url: "u/{user}/{controller}/{action}/{id}", 
       defaults: new { controller = "Accueil", action = "Index", user = 0, id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Accueil", action = "Index", id = UrlParameter.Optional } 
      ); 

Entonces, estas 3 rutas conducen a myAction en myController con el parámetro myParam:

  1. http://example.com/c/myParam
  2. http://example.com/myController/myAction/myParam
  3. http://example.com/u/0/myController/myAction/myParam

Si mi acción es como sigue

public class SiteController : ControllerCommon 
    { 

     [OutputCache(Duration = 86400, VaryByParam = "id")] 
     public ActionResult Cabinet(string id) 
     { 
      return View(); 
} 
} 

voy a tener una memoria caché para cada ruta (en este caso 3). Por lo tanto, tendré que invalidar cada ruta.

gusta esta

private void InvalidateCache(string id) 
     { 
      var urlToRemove = Url.Action("myAction", "myController", new { id}); 
      //this will always clear the cache as the route config will create the path 
      Response.RemoveOutputCacheItem(urlToRemove); 
      Response.RemoveOutputCacheItem(string.Format("/myController/myAction/{0}", id)); 
      Response.RemoveOutputCacheItem(string.Format("/u/0/myController/myAction/{0}", id)); 
     } 
Cuestiones relacionadas