web-dev-qa-db-fra.com

ASP.NET MVC comment désactiver l'option de mise en cache automatique?

Comment désactiver la mise en cache automatique du navigateur depuis l'application asp.Net mvc?

Parce que j'ai un problème avec la mise en cache car il met en cache tous les liens. Mais parfois, il redirigeait automatiquement vers DEFAULT INDEX PAGE qui le stockait en mémoire cache, puis tout le temps que je clique sur ce lien, il me redirigera vers DEFAULT INDEX PAGE.

Ainsi, quelqu'un sait comment désactiver manuellement l'option de mise en cache d'ASP.NET MVC 4?

70
Raj Tamakuwala

Vous pouvez utiliser OutputCacheAttribute pour contrôler la mise en cache du serveur et/ou du navigateur pour des actions spécifiques ou pour toutes les actions d'un contrôleur.

Désactiver pour toutes les actions dans un contrôleur

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will be applied to all actions in MyController, unless those actions override with their own decoration
public class MyController : Controller
{
  // ... 
}

Désactiver pour une action spécifique:

public class MyController : Controller
{
    [OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)] // will disable caching for Index only
    public ActionResult Index()
    {
       return View();
    }
} 

Si vous souhaitez appliquer une stratégie de mise en cache par défaut à toutes les actions de tous les contrôleurs, vous pouvez ajouter un filtre d'action global en modifiant votre global.asax.cs et en recherchant la méthode RegisterGlobalFilters. Cette méthode est ajoutée dans le modèle de projet d'application MVC par défaut.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new OutputCacheAttribute
                    {
                        VaryByParam = "*",
                        Duration = 0,
                        NoStore = true,
                    });
    // the rest of your global filters here
}

Cela entraînera l'application du OutputCacheAttribute spécifié ci-dessus à chaque action, ce qui désactivera la mise en cache du serveur et du navigateur. Vous devriez toujours pouvoir remplacer ce no-cache en ajoutant OutputCacheAttribute à des actions et à des contrôleurs spécifiques.

134
HackedByChinese

HackedByChinese manque le point. Il a confondu le cache du serveur avec le cache du client. OutputCacheAttribute contrôle le cache du serveur (cache IIS http.sys), mais pas celui des navigateurs (clients).

Je vous donne une très petite partie de mon code. Fais-en bon usage.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public sealed class NoCacheAttribute : FilterAttribute, IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
    }

    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetCacheability(HttpCacheability.NoCache);
        cache.SetRevalidation(HttpCacheRevalidation.ProxyCaches);
        cache.SetExpires(DateTime.Now.AddYears(-5));
        cache.AppendCacheExtension("private");
        cache.AppendCacheExtension("no-cache=Set-Cookie");
        cache.SetProxyMaxAge(TimeSpan.Zero);
    }
}

Usage:

/// will be applied to all actions in MyController
[NoCache]
public class MyController : Controller
{
    // ... 
}

Utilisez-le à bon escient car il désactive réellement tout le cache client. Le seul cache non désactivé est le cache du navigateur "bouton précédent". Mais il semble qu'il n'y ait vraiment aucun moyen de le contourner. Peut-être uniquement en utilisant javascript pour le détecter et forcer l'actualisation de la page ou des zones de la page.

28
Softlion

Nous pouvons définir le profil de cache dans le fichier Web.config au lieu de définir les valeurs de cache individuellement dans les pages pour éviter le code redondant. Nous pouvons faire référence au profil en utilisant la propriété CacheProfile de l'attribut OutputCache. Ce profil de cache sera appliqué à toutes les pages à moins que la page/méthode ne remplace ces paramètres.

<system.web>
  <caching>
    <outputCacheSettings>
      <outputCacheProfiles>
        <add name="CacheProfile" duration="60" varyByParam="*" />
      </outputCacheProfiles>
    </outputCacheSettings>
  </caching>
</system.web>

Et si vous souhaitez désactiver la mise en cache de votre action ou de votre contrôleur, vous pouvez remplacer les paramètres du cache de configuration en décorant cette méthode d'action spécifique, comme indiqué ci-dessous:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult NoCachingRequired()
{
    return PartialView("abcd");
}

J'espère que cela est clair et vous est utile.

12
Swati Gupta

Si vous souhaitez empêcher la mise en cache du navigateur, vous pouvez utiliser ce code de ShareFunction

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);
}
9
Jeff Lequeux

Pour la solution sur la page, définissez ceci dans votre page de présentation:

<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
5
Pranav Labhe

Pour que ma réponse soit visible à tous, je propose mon commentaire pour répondre à cette question.

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

Cela fonctionnera dans tous les navigateurs (IE, Firefox et Chrome également)). Heureux d’entendre que ma réponse a fonctionné pour vous @Joseph Katzman

0
Kannan_PK