Empêcher la mise en cache dans ASP.NET MVC pour des actions spécifiques utilisant un atsortingbut

J’ai une application ASP.NET MVC 3. Cette application demande des enregistrements via JQuery. JQuery rappelle une action de contrôleur qui renvoie des résultats au format JSON. Je n’ai pas pu le prouver, mais je crains que mes données ne soient mises en cache.

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

Existe-t-il un atsortingbut que je peux mettre en place pour que les données ne soient pas mises en cache? Si non, comment puis-je m’assurer que le navigateur obtient un nouvel ensemble d’enregistrements à chaque fois, au lieu d’un ensemble mis en cache?

Pour vous assurer que JQuery ne met pas les résultats en cache, appliquez les méthodes suivantes sur vos méthodes ajax:

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

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

 [AtsortingbuteUsage(AtsortingbuteTargets.Class | AtsortingbuteTargets.Method)] public sealed class NoCacheAtsortingbute : ActionFilterAtsortingbute { 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, décorez simplement votre contrôleur avec [NoCache] . Pour le faire, vous pouvez simplement mettre l’atsortingbut sur la classe de la classe de base à partir de laquelle vous héritez vos contrôleurs (si vous en avez un), comme ici:

 [NoCache] public class ControllerBase : Controller, IControllerBase 

Vous pouvez également décorer certaines des actions avec cet atsortingbut si vous en avez besoin, au lieu de décorer le contrôleur entier.

Si votre classe ou action ne comportait pas NoCache lors du rendu dans votre navigateur et que vous souhaitiez vérifier son fonctionnement, rappelez-vous qu’après avoir compilé les modifications, vous devez effectuer une “actualisation matérielle” (Ctrl + F5) dans votre navigateur. Tant que vous ne le faites pas, votre navigateur conservera l’ancienne version en cache et ne le rafraîchira pas avec un “rafraîchissement normal” (F5).

Vous pouvez utiliser l’atsortingbut de cache intégré pour empêcher la mise en cache.

Pour .net Framework: [OutputCache(NoStore = true, Duration = 0)]

Pour .net Core: [ResponseCache(NoStore = true, Duration = 0)]

Sachez qu’il est impossible de forcer le navigateur à désactiver la mise en cache. Le mieux que vous puissiez faire est de fournir des suggestions que la plupart des navigateurs vont honorer, généralement sous la forme d’en-têtes ou de balises META. Cet atsortingbut décorateur désactive la mise en cache du serveur et ajoute également cet en-tête: Cache-Control: public, no-store, max-age=0 . Il n’ajoute pas de balises meta. Si vous le souhaitez, ceux-ci peuvent être ajoutés manuellement dans la vue.

De plus, JQuery et d’autres frameworks clients tenteront de tromper le navigateur pour qu’il n’utilise pas sa version en cache en ajoutant des éléments à l’URL, comme un horodatage ou un GUID. Ceci est efficace pour que le navigateur demande à nouveau la ressource mais n’empêche pas vraiment la mise en cache.

Sur une note finale Vous devez être conscient que les ressources peuvent également être mises en cache entre le serveur et le client. Les FAI, les proxys et autres périphériques réseau mettent également en cache les ressources et utilisent souvent des règles internes sans examiner la ressource réelle. Il n’y a pas grand chose à faire à ce sujet. La bonne nouvelle est qu’ils cachent généralement des délais plus courts, comme les secondes ou les minutes.

Tout ce dont tu as besoin c’est:

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

ou, si vous souhaitez le désactiver pour un contrôleur entier:

 [OutputCache(Duration=0)] public class MyController 

Malgré le débat dans les commentaires ici, cela suffit pour désactiver la mise en cache du navigateur – cela amène ASP.Net à émettre des en-têtes de réponse indiquant au navigateur que le document expire immédiatement:

OutputCache Duration = 0 En-têtes de réponse: max-age = 0, s-maxage = 0

Dans l’action du contrôleur append à l’en-tête les lignes suivantes

  public ActionResult Create(ssortingng 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. 

Voici l’atsortingbut NoCache proposé par mattytommo, simplifié en utilisant les informations de la réponse de Chris Moschini:

 [AtsortingbuteUsage(AtsortingbuteTargets.Class | AtsortingbuteTargets.Method)] public sealed class NoCacheAtsortingbute : OutputCacheAtsortingbute { public NoCacheAtsortingbute() { this.Duration = 0; } } 

Pour MVC6 ( DNX ), il n’y a pas System.Web.OutputCacheAtsortingbute

Remarque: lorsque vous définissez le paramètre NoStore Duration n’est pas pris en compte. Il est possible de définir une durée initiale pour la première inscription et de la remplacer par des atsortingbuts personnalisés.

Mais nous avons Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter

  public void ConfigureServices(IServiceCollection services) ... services.AddMvc(config=> { config.Filters.Add( new ResponseCacheFilter( new CacheProfile() { NoStore=true })); } ... ) 

Il est possible de remplacer le filtre initial par un atsortingbut personnalisé

  [AtsortingbuteUsage(AtsortingbuteTargets.Class | AtsortingbuteTargets.Method)] public sealed class NoCacheAtsortingbute : ActionFilterAtsortingbute { public override void OnResultExecuting(ResultExecutingContext filterContext) { var filter=filterContext.Filters.Where(t => t.GetType() == typeof(ResponseCacheFilter)).FirstOrDefault(); if (filter != null) { ResponseCacheFilter f = (ResponseCacheFilter)filter; f.NoStore = true; //f.Duration = 0; } base.OnResultExecuting(filterContext); } } 

Voici un cas d’utilisation

  [NoCache] [HttpGet] public JsonResult Get() { return Json(new DateTime()); } 

Mise en cache de sortie dans MVC

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

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

La valeur d’atsortingbut correcte pour Asp.Net MVC Core afin d’empêcher la mise en cache du navigateur (y compris Internet Explorer 11 ) est la suivante:

 [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)] 

comme décrit dans la documentation Microsoft:

Mise en cache des réponses dans ASP.NET Core – NoStore et Location.None