Desabilitar o cache do navegador para todo o site do ASP.NET

Eu estou procurando um método para desativar o cache do navegador para um site da ASP.NET MVC inteiro

Eu encontrei o seguinte método:

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

E também um método de meta tag (não funciona para mim, já que algumas ações do MVC enviam HTML / JSON parcial através do Ajax, sem uma meta tag meta).

  

Mas estou procurando um método simples para desativar o cache do navegador para um site inteiro.

 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 as solicitações são roteadas através do default.aspx primeiro – portanto, supondo que você possa simplesmente inserir o código por trás dele.

Crie uma class que herda 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); } } 

Em seguida, coloque os atributos onde for necessário …

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

Em vez de rolar o seu próprio, basta usar o que é fornecido para você.

Como mencionado anteriormente, não desative o cache para tudo. Por exemplo, os scripts de jQuery usados ​​intensamente no ASP.NET MVC devem ser armazenados em cache. Na verdade, idealmente, você deve estar usando um CDN para aqueles de qualquer maneira, mas meu ponto é que algum conteúdo deve ser armazenado em cache.

O que eu acho que funciona melhor aqui em vez de polvilhar o [OutputCache] em todos os lugares é usar uma class:

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

Todos os seus controladores que você deseja desabilitar o cache herdarão desse controlador.

Se você precisar replace os padrões na class NoCacheController, simplesmente especifique as configurações de cache em seu método de ação e as configurações em seu método Action terão precedência.

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

Você pode desabilitar o cache do navegador para todas as páginas renderizadas pelos controladores (por exemplo, páginas HTML), mas manter o cache em vigor para resources como scripts, folhas de estilo e imagens . Se você estiver usando agregação e minificação MVC4 +, será necessário manter as durações de cache padrão para scripts e folhas de estilo (durações muito longas, pois o cache é invalidado com base em uma alteração em uma URL exclusiva, não com base na hora).

No MVC4 +, para desativar o cache do navegador em todos os controladores, mas retê-lo para qualquer coisa que não seja atendida por um controlador, inclua isso em FilterConfig.RegisterGlobalFilters :

 filters.Add(new DisableCache()); 

Defina DisableCache seguinte forma:

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

Eu sei que essa resposta não está 100% relacionada à pergunta, mas pode ajudar alguém.

Se você quiser desabilitar o cache do navegador para todo o site ASP.NET MVC , mas você só quer fazer isso TEMPORARIAMENTE, então é melhor desabilitar o cache no seu navegador.

Aqui está uma captura de tela no Chrome

Implementei todas as respostas anteriores e ainda tinha uma visão que não funcionava corretamente.

Descobriu-se que o nome da visão com a qual eu estava tendo o problema se chamava ‘Recente’. Aparentemente, isso confundiu o navegador Internet Explorer.

Depois que mudei o nome da view (no controller) para um nome diferente (optei por ‘Recent5’), as soluções acima começaram a funcionar.

Você pode tentar abaixo o código no arquivo 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"; %> 

fundo

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