net mvc enable data cache asp asp.net-mvc caching

enable - ¿Cómo "invalidar" partes de la memoria caché de salida ASP.NET MVC?



outputcache mvc 5 (2)

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

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

Digamos que tengo esta configuración de ruta:

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 param 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 la siguiente

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

Tendré un caché para cada ruta (en este caso 3). Por lo tanto, tendré que invalidar cada ruta.

Me gusta esto

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

¿Hay alguna manera 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é.

¿Esto es posible?


Una forma es usar el método:

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

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

Creo que podría implementar el segundo método utilizando un atributo de nivel de método para cada acción que desee y simplemente agregarle la cadena que representa la clave. Eso es si entendí tu pregunta.

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

Si está utilizando varyByParam="none" , simplemente invalida "/Statistics" , es decir, 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 agregas varyByParam="id1" y luego creas varias versiones de la página, si dices que invalidar invalidar "/Statistics/id1" invalidará solo esa versión. Pero deberías hacer más pruebas.