211 votes

Empêcher la mise en Cache dans ASP.NET MVC pour des actions spécifiques à l'aide d'un attribut

J'ai un ASP.NET MVC 3 application. Cette application demande enregistrements grâce à JQuery. JQuery appelle de nouveau à l'action d'un contrôleur qui renvoie les résultats au format JSON. Je n'ai pas été en mesure de le prouver, mais je crains que mes données peut être mise en cache.

Je veux seulement la mise en cache pour être appliquée à des actions spécifiques, pas pour toutes les actions.

Est-il un attribut que je peux mettre sur une action pour s'assurer que les données n'est pas mise en cache? Si non, comment puis-je m'assurer que le navigateur reçoit une nouvelle série d'enregistrements à chaque fois, au lieu de cache jeu?

317voto

mattytommo Points 27587

Pour s'assurer que JQuery n'est pas mise en cache les résultats, sur vos méthodes ajax, mettre les éléments suivants:

$.ajax({
    cache: false
    //rest of your ajax setup
});

Ou à empêcher la mise en cache dans MVC, nous avons créé notre propre attribut, vous pourriez faire la même chose. Voici notre code:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed 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 il suffit de décorer votre contrôleur avec [NoCache]. OU de le faire pour tout ce que tu pourrais juste mettre l'attribut de la classe de la classe de base que vous héritez de vos contrôleurs de (si vous en avez un) comme ici:

[NoCache]
public class ControllerBase : Controller, IControllerBase

Vous pouvez également décorer certaines des actions avec cet attribut si vous en avez besoin pour être non mis en cache, au lieu de decoarting l'ensemble du contrôleur.

Si votre classe ou de l'action n'avait pas NoCahe lorsqu'il a été rendu dans votre navigateur et que vous voulez vérifier qu'il fonctionne n'oubliez pas qu'après la compilation les modifications que vous avez besoin de faire un "rafraîchissement" (Ctrl+F5) dans votre navigateur. Jusqu'à ce que vous le faites, votre navigateur va garder l'ancienne version en cache, et de ne pas l'actualiser avec un "normal actualiser (F5).

273voto

Jared Points 760

Désormais, vous pouvez simplement utiliser le construit en OutputCacheAttribute à empêcher la mise en cache:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

50voto

Chris Moschini Points 7278

Tous vous avez besoin est:

[OutputCache(Duration=0)]
public JsonResult MyAction(

ou, si vous voulez la désactiver pour l'ensemble de la commande:

[OutputCache(Duration=0)]
public class MyController

Malgré le débat dans les commentaires ici, c'est assez pour désactiver la mise en cache du navigateur - ce qui provoque ASP.Net pour émettre des en-têtes de réponse dites le navigateur, le document expire immédiatement:

OutputCache Duration=0 Response Headers: max-age=0, s-maxage=0

18voto

dfortun Points 149

Dans l'action du controller ajouter à l'en-tête les lignes suivantes

    public ActionResult Create(string PositionID)
    {
        Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
        Response.AppendHeader("Expires", "0"); // Proxies.

0voto

Jeff Lequeux Points 21

100% d'accord avec mattytommo.

J'ai poster le même code (à partir de l'un de mes plus vieux projet) voir: ShareFunction.com

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