Mónica, miembro de nuestro equipo, nos ha hecho el favor de crear esta crónica ya que conoce a la perfección dicho tema.
Solución:
Puedes usar el OutputCacheAttribute
para controlar el almacenamiento en caché del servidor y / o navegador para acciones específicas o todas las acciones en un controlador.
Desactivar para todas las acciones en un controlador
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration
public class MyController : Controller
// ...
Desactivar para una acción específica:
public class MyController : Controller
[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only
public ActionResult Index()
return View();
Si desea aplicar una estrategia de almacenamiento en caché predeterminada a todas las acciones en todos los controladores, puede agregar un filtro de acción global editando su global.asax.cs
y buscando el RegisterGlobalFilters
método. Este método se agrega en la plantilla de proyecto de aplicación MVC predeterminada.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
filters.Add(new OutputCacheAttribute
VaryByParam = "*",
Duration = 0,
NoStore = true,
);
// the rest of your global filters here
Esto hará que se aplique el OutputCacheAttribute
especificado anteriormente para cada acción, lo que deshabilitará el almacenamiento en caché del servidor y del navegador. Aún debería poder anular esta no-caché agregando OutputCacheAttribute
a acciones y controladores específicos.
HackedByChinese no comprende el punto. Confundió la caché del servidor con la caché del cliente. OutputCacheAttribute controla la caché del servidor (caché http.sys de IIS), no la caché de los navegadores (clientes).
Te doy una parte muy pequeña de mi código base. Úsalo con sabiduría.
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class NoCacheAttribute : FilterAttribute, IResultFilter
public void OnResultExecuting(ResultExecutingContext filterContext)
public void OnResultExecuted(ResultExecutedContext filterContext)
var cache = filterContext.HttpContext.Response.Cache;
cache.SetCacheability(HttpCacheability.NoCache);
cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
cache.SetExpires(DateTime.Now.AddYears(-5));
cache.AppendCacheExtension("private");
cache.AppendCacheExtension("no-cache=Set-Cookie");
cache.SetProxyMaxAge(TimeSpan.Zero);
Uso:
/// will be applied to all actions in MyController
[NoCache]
public class MyController : Controller
// ...
Úselo sabiamente ya que realmente deshabilita todo el caché del cliente. El único caché que no está deshabilitado es el caché del navegador “botón de retroceso”. Pero parece que realmente no hay forma de evitarlo. Tal vez solo usando javascript para detectarlo y forzar la actualización de la página o las zonas de la página.
Podemos configurar el perfil de caché en el archivo Web.config en lugar de configurar los valores de caché individualmente en las páginas para evitar código redundante. Podemos referir el perfil usando la propiedad CacheProfile de OutputCache attribute. Este perfil de caché se aplicará a todas las páginas a menos que la página o el método anulen esta configuración.
Y si desea deshabilitar el almacenamiento en caché de su acción o controlador en particular, puede anular la configuración de la caché de configuración decorando ese método de acción específico como se muestra a continuación:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult NoCachingRequired()
return PartialView("abcd");
Espero que esto te quede claro y te sea útil.
Si piensas que te ha sido de provecho nuestro artículo, te agradeceríamos que lo compartas con más juniors así contrubuyes a difundir nuestro contenido.