Deshabilitar el caché del navegador para todo el sitio web de ASP.NET

Estoy buscando un método para desactivar la memoria caché del navegador para todo un sitio web ASP.NET MVC

Encontré el siguiente método:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); Response.Cache.SetNoStore(); 

Y también un método de metaetiqueta (no funcionará para mí, ya que algunas acciones de MVC envían HTML / JSON parcial a través de Ajax, sin encabezado, metaetiqueta).

  

Pero estoy buscando un método simple para deshabilitar el caché del navegador para un sitio web completo.

 HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); HttpContext.Current.Response.Cache.SetValidUntilExpires(false); HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); HttpContext.Current.Response.Cache.SetNoStore(); 

Todas las solicitudes se enrutan primero a través de default.aspx, por lo que se puede ingresar el código allí.

Crea una clase que herede de IActionFilter.

 public class NoCacheAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); filterContext.HttpContext.Response.Cache.SetNoStore(); base.OnResultExecuting(filterContext); } } 

Luego ponga los atributos donde sea necesario …

 [NoCache] [HandleError] public class AccountController : Controller { [NoCache] [Authorize] public ActionResult ChangePassword() { return View(); } } 

En lugar de enrollar el suyo, simplemente use lo que se le proporcionó.

Como se mencionó anteriormente, no deshabilite el almacenamiento en caché para todo. Por ejemplo, las secuencias de comandos de jQuery utilizadas en gran medida en ASP.NET MVC deben almacenarse en caché. De hecho, idealmente debería usar un CDN para eso, pero mi punto es que parte del contenido debe almacenarse en caché.

Lo que encuentro que funciona mejor aquí que rociar el [OutputCache] en todas partes es usar una clase:

 [System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")] public class NoCacheController : Controller { } 

Todos sus controladores que desea desactivar el almacenamiento en caché para luego heredar de este controlador.

Si necesita anular los valores predeterminados en la clase NoCacheController, simplemente especifique la configuración de caché en su método de acción y la configuración en su método de Acción tendrá prioridad.

 [HttpGet] [OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")] public ViewResult Index() { ... } 

Es posible que desee deshabilitar el almacenamiento en caché del navegador para todas las páginas presentadas por los controladores (es decir, páginas HTML), pero mantenga el almacenamiento en caché para recursos como scripts, hojas de estilo e imágenes . Si usa MVC4 + empaquetado y minificación, querrá mantener las duraciones de caché predeterminadas para las secuencias de comandos y las hojas de estilo (duraciones muy largas, ya que la caché se invalida en función de un cambio en una URL única, no en función del tiempo).

En MVC4 +, para deshabilitar el almacenamiento en caché del navegador en todos los controladores, pero retenerlo para todo lo que no sea servido por un controlador, agréguelo a FilterConfig.RegisterGlobalFilters :

 filters.Add(new DisableCache()); 

Defina DisableCache siguiente manera:

 class DisableCache : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); } } 

Sé que esta respuesta no está 100% relacionada con la pregunta, pero podría ayudar a alguien.

Si desea desactivar el caché del navegador para todo el sitio web ASP.NET MVC , pero solo desea hacerlo TEMPORALMENTE, entonces es mejor desactivar el caché en su navegador.

Aquí hay una captura de pantalla en Chrome

Implementé todas las respuestas anteriores y todavía tenía una vista que no funcionó correctamente.

Resultó que el nombre de la vista con la que estaba teniendo el problema se llamaba ‘Reciente’. Al parecer, esto confundió el navegador de Internet Explorer.

Después de cambiar el nombre de la vista (en el controlador) a un nombre diferente (elegí ‘Recent5’), las soluciones anteriores comenzaron a funcionar.

Puede probar el siguiente código en el archivo Global.asax.

 protected void Application_BeginRequest() { Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1)); Response.Cache.SetNoStore(); } 

UI

 < %@ OutPutCache Location="None"%> < % Response.Buffer = true; Response.Expires = -1; Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); Response.CacheControl = "no-cache"; %> 

Fondo

 Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Expires = -1; Response.Cache.SetNoStore();