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 souhaite uniquement que la mise en cache soit appliquée à des actions spécifiques, pas à toutes les actions.
Existe-t-il un attribut que je peux mettre sur une action pour garantir que les données ne sont pas mises en cache? Sinon, comment puis-je m'assurer que le navigateur obtient un nouvel ensemble d'enregistrements à chaque fois, au lieu d'un ensemble mis en cache?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
Développeur JavaScript
la source
la source
Réponses:
Pour vous assurer que JQuery ne met pas les résultats en cache, sur vos méthodes ajax, mettez ce qui suit:
Ou pour empêcher la mise en cache dans MVC, nous avons créé notre propre attribut, vous pouvez faire de même. Voici notre code:
Décorez ensuite votre contrôleur avec
[NoCache]
. OU pour le faire pour tout, vous pouvez simplement mettre l'attribut sur la classe de la classe de base dont vous héritez vos contrôleurs (si vous en avez un) comme nous l'avons ici:Vous pouvez également décorer certaines des actions avec cet attribut si vous avez besoin qu'elles ne soient pas mises en cache, au lieu de décorer l'ensemble du contrôleur.
Si votre classe ou action n'avait pas
NoCache
quand elle a été rendue dans votre navigateur et que vous voulez vérifier qu'elle fonctionne, rappelez-vous qu'après avoir compilé les modifications, vous devez effectuer une "actualisation matérielle" (Ctrl + F5) dans votre navigateur. Jusqu'à ce que vous le fassiez, votre navigateur conservera l'ancienne version mise en cache et ne la rafraîchira pas avec une "actualisation normale" (F5).la source
Vous pouvez utiliser l'attribut 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 respecteront, généralement sous la forme d'en-têtes ou de balises META. Cet attribut décorateur désactive la mise en cache du serveur et ajouter 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 d'inciter le navigateur à ne pas utiliser sa version mise en cache d'une ressource en ajoutant des éléments à l'URL, comme un horodatage ou un GUID. Ceci est efficace pour obliger le navigateur à demander à nouveau la ressource mais n'empêche pas vraiment la mise en cache.
Sur une note finale. Vous devez savoir 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 regarder la ressource réelle. Il n'y a pas grand-chose que vous puissiez faire à ce sujet. La bonne nouvelle est qu'ils mettent généralement en cache pour des délais plus courts, comme les secondes ou les minutes.
la source
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.NoStore = true
etDuration = 0
(que j'ai utilisé avec succès, merci), mais quel effet supplémentaire auraitVaryByParam = "None"
comme les deux autres options affectent toutes les demandes quel que soit le paramètre?Tout ce dont tu as besoin c'est:
ou, si vous souhaitez le désactiver pour un contrôleur entier:
Malgré le débat dans les commentaires ici, cela suffit pour désactiver la mise en cache du navigateur - cela provoque ASP.Net à émettre des en-têtes de réponse qui indiquent au navigateur que le document expire immédiatement:
la source
Cache-Control
àpublic
max-age=0
n'a jamais signifié «cache désactivé». Cela signifie seulement que le contenu de la réponse doit être pris en compte immédiatement périmé , mais un cache est autorisé à le mettre en cache. Les navigateurs doivent valider la fraîcheur du contenu périmé mis en cache avant de l'utiliser, mais ce n'est pas obligatoire sauf si la directive supplémentairemust-revalidate
est spécifiée.Dans l'action du contrôleur, ajoutez à l'en-tête les lignes suivantes
la source
Voici l'
NoCache
attribut proposé par mattytommo, simplifié en utilisant les informations de la réponse de Chris Moschini:la source
max-age=0
n'a jamais signifié «cache désactivé». Cela ne signifie que le contenu de la réponse doit être considéré comme immédiatement périmé , mais un cache est autorisé à le mettre en cache. Les navigateurs doivent valider la fraîcheur du contenu périmé mis en cache avant de l'utiliser, mais ce n'est pas obligatoire sauf si la directive supplémentairemust-revalidate
est spécifiée.no-cache
, qui permet toujours la mise en cache mais mandat de revalider le serveur d'origine avant toute utilisation. Pour éviter même la mise en cache revalidée, vous devez ajouterno-store
avecno-cache
. (no-store
seul est clairement faux parce que les caches volatiles sont autorisés à mettre en cache le contenu marqué commeno-store
.)Pour MVC6 ( DNX ), il n'y a pas
System.Web.OutputCacheAttribute
Remarque: lorsque vous définissez
NoStore
paramètre Durée n'est pas pris en compte. Il est possible de définir une durée initiale pour le premier enregistrement et de la remplacer par des attributs personnalisés.Mais nous avons
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
Il est possible de remplacer le filtre initial avec un attribut personnalisé
Voici un cas d'utilisation
la source
Mise en cache de sortie dans MVC
la source
La valeur d'attribut correcte pour Asp.Net MVC Core pour empêcher la mise en cache du navigateur (y compris Internet Explorer 11 ) est:
comme décrit dans la documentation Microsoft:
Mise en cache des réponses dans ASP.NET Core - NoStore et Location.None
la source
Solutions ASP.NET MVC 5:
App_Start/FilterConfig.cs
de »RegisterGlobalFilters
méthode:OutputCache
directive différente au niveauController
ou auView
niveau. Pour le contrôleur ordinaire, c'estou si c'est un
ApiController
ce seraitla source