199 votos

Desactivar la caché del navegador para todo el sitio web ASP.NET

Estoy buscando un método para desactivar la caché del navegador para un Sitio web completo de ASP.NET MVC

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 me funcionará, ya que algunas acciones MVC envían HTML/JSON parcial a través de Ajax, sin una etiqueta head, meta).

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

Pero estoy buscando un método sencillo para desactivar la caché del navegador para todo un sitio web.

367voto

JKG Puntos 3701

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

Entonces, pon los atributos donde sea necesario...

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

132voto

Adam Tuliper - MSFT Puntos 22478

En lugar de enrollar el suyo propio, simplemente utilice lo que se le proporciona.

Como se ha mencionado anteriormente, no hay que desactivar la caché para todo. Por ejemplo, los jQuery scripts utilizados en gran medida en ASP.NET MVC deben ser almacenados en caché. En realidad, lo ideal sería utilizar un CDN para esos de todos modos, pero mi punto es que algunos contenidos deben ser cacheados.

Lo que encuentro que funciona mejor aquí en lugar de espolvorear el [OutputCache] en todas partes es utilizar una clase:

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

Todos los controladores para los que quieras desactivar la caché heredarán de este controlador.

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

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

92voto

Paul Puntos 1341
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 dirigen primero a través de default.aspx, por lo que se supone que se puede introducir el código detrás de él.

10voto

Edward Brey Puntos 8771

Es posible que desee deshabilitar el almacenamiento en caché del navegador para todas las páginas renderizadas por los controladores (es decir, las páginas HTML), pero mantener la caché en su lugar para recursos como scripts, hojas de estilo e imágenes . Si está utilizando la agrupación y minificación MVC4+, querrá mantener las duraciones de caché por defecto para los scripts 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 desactivar la caché del navegador en todos los controladores, pero mantenerla para todo lo que no sea servido por un controlador, añada esto a FilterConfig.RegisterGlobalFilters :

filters.Add(new DisableCache());

Definir DisableCache de la siguiente manera:

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

6voto

Carlos Martinez Puntos 3151

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

Si desea desactivar la caché del navegador para el Sitio web completo de ASP.NET MVC pero sólo quieres hacerlo TEMPORALMENTE, entonces es mejor desactivar la caché de tu navegador.

Here's a screenshot in Chrome

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X