199 votes

Désactiver le cache du navigateur pour l'ensemble du site Web ASP.Net

Je cherche une méthode pour désactiver le cache du navigateur pour tout le site ASP.Net MVC

J'ai trouvé la méthode suivante,

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

et aussi la méthode de la balise méta, (Cela ne fonctionne pas pour moi, car certaines actions MVC envoient du html/json partiel par ajax, sans balise head, meta).

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

Mais je cherche une méthode simple pour désactiver le cache du navigateur pour tout le site web.

365voto

JKG Points 3701

Créez 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);
    }
}

Ensuite, mettez des attributs là où c'est nécessaire...

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

132voto

Adam Tuliper - MSFT Points 22478

Je suis un peu en retard pour répondre à cette question, mais au lieu d'utiliser votre propre système, utilisez simplement ce qui vous est fourni. Comme mentionné précédemment, ne désactivez pas la mise en cache pour tout. Par exemple, les scripts jQuery fortement utilisés dans les mvc doivent être mis en cache. En fait, l'idéal serait d'utiliser un CDN pour ces scripts, mais ce que je veux dire, c'est que certains contenus devraient être mis en cache.

Ce que je trouve le plus efficace ici, plutôt que de saupoudrer les [OutputCache] partout, c'est d'utiliser une classe :

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

Tous les contrôleurs pour lesquels vous souhaitez désactiver la mise en cache héritent ensuite de ce contrôleur.

Si vous avez besoin de remplacer les valeurs par défaut de la classe NoCacheController, il vous suffit de spécifier les paramètres de cache dans votre méthode d'action et les paramètres de votre méthode d'action auront la priorité.

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

92voto

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

Toutes les demandes sont d'abord acheminées par default.aspx, ce qui laisse supposer que vous pouvez simplement insérer du code derrière.

10voto

Edward Brey Points 8771

Vous pouvez vouloir désactiver la mise en cache du navigateur pour toutes les pages rendues par les contrôleurs (c'est-à-dire les pages HTML), mais conserver la mise en cache en place pour des ressources telles que les scripts, les feuilles de style et les images . Si vous utilisez le regroupement et la minification de MVC4+, 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é en fonction d'une modification d'une URL unique, et non en fonction du temps).

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

filters.Add(new DisableCache());

Définir DisableCache comme suit :

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

6voto

Carlos Martinez Points 3151

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

Si vous voulez désactiver le cache du navigateur pour l'application tout le site ASP.Net MVC mais que vous ne voulez le faire que TEMPORAIREMENT, il est préférable de désactiver le cache dans votre navigateur.

Here's a screenshot in Chrome

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X