Distriggers la cache del browser per l’intero sito Web ASP.NET

Sto cercando un metodo per disabilitare la cache del browser per un intero sito Web ASP.NET MVC

Ho trovato il seguente metodo:

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

E anche un metodo di meta tag (non funzionerà per me, dal momento che alcune azioni MVC inviano HTML / JSON parziale tramite Ajax, senza un meta, meta tag).

  

Ma sto cercando un metodo semplice per disabilitare la cache del browser per un intero sito web.

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

Tutte le richieste vengono instradate prima tramite default.aspx, quindi supponendo che sia ansible inserire semplicemente il codice.

Creare una class che eredita da 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); } } 

Quindi inserisci gli attributi dove necessario …

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

Invece di lanciare il tuo, usa semplicemente ciò che ti viene fornito.

Come accennato in precedenza, non disabilitare la cache per tutto. Ad esempio, gli script jQuery utilizzati pesantemente in ASP.NET MVC devono essere memorizzati nella cache. In realtà idealmente dovresti usare comunque un CDN per quelli, ma il mio punto è che alcuni contenuti dovrebbero essere memorizzati nella cache.

Quello che trovo funziona meglio qui piuttosto che spargere il [OutputCache] ovunque è usare una class:

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

Tutti i controller che si desidera disabilitare per la memorizzazione nella cache vengono quindi ereditati da questo controller.

Se è necessario sovrascrivere i valori predefiniti nella class NoCacheController, è sufficiente specificare le impostazioni della cache sul metodo di azione e le impostazioni sul metodo Action avranno la precedenza.

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

È ansible disabilitare la memorizzazione nella cache del browser per tutte le pagine renderizzate dai controllori (ad esempio pagine HTML), ma mantenere la memorizzazione nella cache per risorse come script, fogli di stile e immagini . Se utilizzi il raggruppamento e la minimizzazione MVC4 +, ti consigliamo di conservare le durate predefinite della cache per script e fogli di stile (durate molto lunghe, poiché la cache viene invalidata in base a una modifica a un URL univoco, non basata sul tempo).

In MVC4 +, per disabilitare il caching del browser su tutti i controller, ma conservarlo per tutto ciò che non è servito da un controller, aggiungilo a FilterConfig.RegisterGlobalFilters :

 filters.Add(new DisableCache()); 

Definisci DisableCache come segue:

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

So che questa risposta non è correlata al 100% alla domanda, ma potrebbe aiutare qualcuno.

Se si desidera disabilitare la cache del browser per l’ intero sito Web ASP.NET MVC , ma si desidera farlo TEMPORANEAMENTE, è meglio disabilitare la cache nel browser.

Ecco uno screenshot in Chrome

Ho implementato tutte le risposte precedenti e avevo ancora una vista che non funzionava correttamente.

Si è scoperto che il nome della vista con cui avevo riscontrato il problema era denominato “Recent”. Apparentemente questo ha confuso il browser Internet Explorer.

Dopo aver cambiato il nome della vista (nel controller) con un nome diverso (ho scelto di ‘Recent5’), le soluzioni sopra hanno iniziato a funzionare.

Puoi provare sotto il codice nel file 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"; %> 

sfondo

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