Désactiver le cache du navigateur pour l'ensemble ASP.NET site web

je cherche une méthode pour désactiver le cache du navigateur pour un entier ASP.NET MVC Website

j'ai trouvé la méthode suivante:

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

et aussi une méthode de balise meta (ça ne marchera pas pour moi, car certaines actions MVC envoient une partie HTML/JSON par Ajax, sans balise head, meta).

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

mais je suis à la recherche d'une méthode simple pour désactiver la cache du navigateur pour un site web entier.

198
demandé sur Md. Alamin Mahamud 2009-07-21 19:52:12

8 réponses

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

toutes les requêtes sont routées par défaut.aspx en premier-donc en supposant que vous pouvez juste entrer le code derrière là.

92
répondu Squiggs 2014-03-07 05:15:40

crée une classe qui hérite 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);
    }
}

puis mettez les attributs là où nécessaire...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}
365
répondu JKG 2012-07-10 16:37:57

au lieu de rouler votre propre, il suffit d'utiliser ce qui est prévu pour vous.

comme mentionné précédemment, ne désactivez pas la mise en cache pour tout. Par exemple, les scripts jQuery sont utilisés ASP.NET MVC devrait être mis en cache. En fait, idéalement, vous devriez utiliser un CDN pour ceux de toute façon, mais mon point est un certain contenu devrait être mis en cache.

ce que je trouve fonctionne mieux ici plutôt que d'arroser le [OutputCache] partout est d'utiliser un classe:

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

tous vos controllers que vous voulez désactiver la mise en cache alors héritez de ce controller.

si vous devez outrepasser les valeurs par défaut dans la classe NoCacheController, spécifiez simplement les paramètres de cache de votre méthode d'action et les paramètres de votre méthode d'Action auront priorité.

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}
132
répondu Adam Tuliper - MSFT 2015-06-19 18:47:07

vous pouvez désactiver la mise en cache du navigateur pour toutes les pages rendues par les contrôleurs (c.-à-d. les pages HTML), mais garder la mise en cache en place pour ressources telles que scripts, feuilles de style, et images . Si vous utilisez MVC4+ bundling et minification, vous voudrez conserver les durées de cache par défaut pour les scripts et les feuilles de style (durées très longues, puisque le cache est invalidé sur la base d'une modification à une URL unique, pas basée sur le temps).

dans MVC4+, pour désactiver la mise en cache du navigateur sur tous les contrôleurs, mais la conserver pour tout ce qui n'est pas servi par un contrôleur, ajouter ceci à FilterConfig.RegisterGlobalFilters :

filters.Add(new DisableCache());

définit DisableCache comme suit:

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}
10
répondu Edward Brey 2014-01-23 14:56:41

je sais que cette réponse n'est pas 100% liée à la question, mais elle pourrait aider quelqu'un.

si vous voulez désactiver le cache du navigateur pour le entier ASP.NET MVC site web , mais vous voulez seulement le faire temporairement, alors il est préférable de désactiver le cache dans votre navigateur.

Here's a screenshot in Chrome

6
répondu Carlos Martinez T 2015-06-19 18:49:46

j'ai mis en œuvre toutes les réponses précédentes et j'avais toujours un point de vue qui ne fonctionnait pas correctement.

il s'est avéré que le nom du point de vue qui me posait problème était "récent". Apparemment, cela a confondu le navigateur Internet Explorer.

après avoir changé le nom de la vue (dans le contrôleur) en un nom différent (j'ai choisi 'Recent5'), les solutions ci-dessus ont commencé à fonctionner.

2
répondu DrHooverCraft 2015-06-19 18:48:52

vous pouvez essayer le code ci-dessous dans Global.fichier asax.

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }
0
répondu NidhinSPradeep 2017-11-08 09:19:29

UI

<%@ OutPutCache Location="None"%>
<%
    Response.Buffer = true;
    Response.Expires = -1;
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
    Response.CacheControl = "no-cache";
%>

arrière-plan

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Expires = -1;          
Response.Cache.SetNoStore();
-1
répondu Alpha 2015-06-19 18:50:16