web-dev-qa-db-fra.com

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 un site Web entier ASP.NET MVC

J'ai trouvé la méthode suivante:

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

Et aussi une méthode de balise méta (cela ne fonctionnera pas pour moi, car certaines actions de MVC envoient un code HTML/JSON partiel via Ajax, sans tête, balise méta).

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

Mais je cherche une méthode simple pour désactiver le cache du navigateur pour un site Web entier.

199
Palani
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 le biais de default.aspx - vous devez donc supposer que le code est inséré derrière.

92
Squiggs.

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

Puis mettez les attributs là où vous en avez besoin ...

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

Au lieu de rouler vous-mê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 largement utilisés dans ASP.NET MVC doivent être mis en cache. En fait, idéalement, vous devriez utiliser un CDN pour ceux-là, mais je pense que certains contenus devraient être mis en cache.

Ce que je trouve qui fonctionne le mieux ici plutôt que de saupoudrer le [OutputCache] partout 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 devez remplacer les valeurs par défaut de la classe NoCacheController, spécifiez simplement les paramètres de cache sur votre méthode d'action et les paramètres de votre méthode d'action seront prioritaires.

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

Vous voudrez peut-être 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 pour des ressources telles que scripts, feuilles de style et images. Si vous utilisez le groupement et la minification MVC4 +, vous voudrez conserver les durées de cache par défaut pour les scripts et les feuilles de style (très longues durées, car le cache est invalidé si vous modifiez une URL unique et non dans 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 desservi par un contrôleur, ajoutez ceci à FilterConfig.RegisterGlobalFilters:

filters.Add(new DisableCache());

Définissez DisableCache comme suit:

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

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

Si vous souhaitez désactiver le cache du navigateur pour le site Web ASP.NET MVC complet, mais que vous souhaitez uniquement procéder TEMPORAIREMENT, il est préférable de désactiver le cache dans votre navigateur.

Here's a screenshot in Chrome

6
Carlos Martinez T

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

Il s'est avéré que le nom de la vue sur laquelle je rencontrais le problème s'appelait "Récent". Apparemment, cela a dérouté 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 l'option 'Récent5'), les solutions ci-dessus ont commencé à fonctionner.

2
DrHooverCraft

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

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }
0
NidhinSPradeep