what mvc dataannotations data curso cache asp asp.net asp.net-mvc caching browser-cache

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



outputcache mvc 5 (8)

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

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

He encontrado el siguiente método:

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

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

<meta http-equiv="PRAGMA" content="NO-CACHE">

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


Crea una clase que hereda 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 hacer rodar el suyo, simplemente use lo que se le proporciona.

Como se mencionó anteriormente, no deshabilite el almacenamiento en caché para todo. Por ejemplo, los scripts jQuery utilizados en gran medida en ASP.NET MVC deben almacenarse en caché. De hecho, lo ideal sería que estuvieras usando un CDN para todos modos, pero mi punto es que algunos contenidos deberían almacenarse en caché.

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

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

Todos los controladores para los que desea deshabilitar el almacenamiento en caché se heredan 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 representadas por los controladores (es decir, las páginas HTML), pero mantener el almacenamiento en caché en su lugar para recursos como scripts, hojas de estilo e imágenes . Si está utilizando MVC4 + agrupación y minificación, querrá mantener las duraciones de caché predeterminadas para scripts y 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 conservarlo para cualquier cosa que no FilterConfig.RegisterGlobalFilters con un controlador, agregue esto a FilterConfig.RegisterGlobalFilters :

filters.Add(new DisableCache());

Defina DisableCache como sigue:

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


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

Resultó que el nombre de la vista con la que tenía 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í "Recientes5"), las soluciones anteriores comenzaron a funcionar.


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


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

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


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 a través de default.aspx en primer lugar, por lo que suponiendo que pueda introducir el código detrás de allí.