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

Resuelto Palani asked hace 15 años • 8 respuestas

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

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 MVC envían HTML/JSON parcial a través de Ajax, sin una metaetiqueta principal).

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

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

Palani avatar Jul 21 '09 22:07 Palani
Aceptado

Cree 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 coloque atributos donde sea necesario...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}
JKG avatar Nov 10 '2009 01:11 JKG

En lugar de hacer el suyo propio, simplemente use lo que se le proporciona.

Como se mencionó anteriormente, no desactive el almacenamiento en caché para todo. Por ejemplo, los scripts jQuery que se utilizan mucho en ASP.NET MVC deben almacenarse en caché. En realidad, lo ideal sería utilizar una CDN para ellos de todos modos, pero mi punto es que parte del contenido debería almacenarse en caché.

Lo que encuentro que funciona mejor aquí en lugar de esparcir [OutputCache] por 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 desactivar el almacenamiento en caché 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 de su método de acción tendrá prioridad.

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}
Adam Tuliper avatar Apr 05 '2011 01:04 Adam Tuliper