Ich habe eine ASP.NET MVC 3-Anwendung. Diese Anwendung fordert Datensätze über jQuery an. jQuery ruft eine Controller-Aktion auf, die Ergebnisse im JSON-Format zurückgibt. Ich konnte dies nicht beweisen, befürchte jedoch, dass meine Daten zwischengespeichert werden.
Ich möchte, dass das Caching nur auf bestimmte Aktionen angewendet wird, nicht auf alle Aktionen.
Gibt es ein Attribut, mit dem ich eine Aktion ausführen kann, um sicherzustellen, dass die Daten nicht zwischengespeichert werden? Wenn nicht, wie stelle ich sicher, dass der Browser jedes Mal einen neuen Satz von Datensätzen anstelle eines zwischengespeicherten Satzes erhält?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
JavaScript-Entwickler
quelle
quelle
Antworten:
Fügen Sie auf Ihren Ajax-Methoden Folgendes ein, um sicherzustellen, dass JQuery die Ergebnisse nicht zwischenspeichert:
Um das Zwischenspeichern in MVC zu verhindern, haben wir unser eigenes Attribut erstellt. Sie können dasselbe tun. Hier ist unser Code:
Dann dekorieren Sie einfach Ihren Controller mit
[NoCache]
. ODER um dies für alles zu tun, können Sie das Attribut einfach auf die Klasse der Basisklasse setzen, von der Sie Ihre Controller erben (falls Sie eine haben), wie wir es hier haben:Sie können auch einige der Aktionen mit diesem Attribut dekorieren, wenn sie nicht zwischenspeicherbar sein müssen, anstatt den gesamten Controller zu dekorieren.
Wenn Ihre Klasse oder Aktion
NoCache
beim Rendern in Ihrem Browser nicht vorhanden war und Sie überprüfen möchten, ob sie funktioniert, denken Sie daran, dass Sie nach dem Kompilieren der Änderungen eine "harte Aktualisierung" (Strg + F5) in Ihrem Browser durchführen müssen. Bis Sie dies tun, behält Ihr Browser die alte zwischengespeicherte Version bei und aktualisiert sie nicht mit einer "normalen Aktualisierung" (F5).quelle
Sie können das integrierte Cache-Attribut verwenden, um das Caching zu verhindern.
Für .net Framework:
[OutputCache(NoStore = true, Duration = 0)]
Für .net Core:
[ResponseCache(NoStore = true, Duration = 0)]
Beachten Sie, dass es unmöglich ist, den Browser zu zwingen, das Caching zu deaktivieren. Das Beste, was Sie tun können, ist, Vorschläge zu machen, die die meisten Browser berücksichtigen, normalerweise in Form von Headern oder Meta-Tags. Dieses Decorator-Attribut deaktiviert das Server-Caching und fügt diesen Header hinzu :
Cache-Control: public, no-store, max-age=0
. Es werden keine Meta-Tags hinzugefügt. Falls gewünscht, können diese manuell in der Ansicht hinzugefügt werden.Darüber hinaus versuchen JQuery und andere Client-Frameworks, den Browser dazu zu bringen, die zwischengespeicherte Version einer Ressource nicht zu verwenden, indem sie der URL Inhalte wie einen Zeitstempel oder eine GUID hinzufügen. Dies führt dazu, dass der Browser erneut nach der Ressource fragt, verhindert jedoch nicht wirklich das Caching.
Zum Schluss noch. Sie sollten sich bewusst sein, dass Ressourcen auch zwischen Server und Client zwischengespeichert werden können. ISPs, Proxys und andere Netzwerkgeräte zwischenspeichern ebenfalls Ressourcen und verwenden häufig interne Regeln, ohne die tatsächliche Ressource zu betrachten. Daran können Sie nicht viel ändern. Die gute Nachricht ist, dass sie normalerweise für kürzere Zeiträume wie Sekunden oder Minuten zwischengespeichert werden.
quelle
Cache-Control:public, no-store, max-age=0
. Es werden keine Meta-Tags hinzugefügt. Falls gewünscht, können diese manuell in der Ansicht hinzugefügt werden.NoStore = true
undDuration = 0
(was ich erfolgreich eingesetzt haben, danke), aber was zusätzliche Wirkung hätteVaryByParam = "None"
haben als die beiden anderen Optionen , um alle Anfragen unabhängig von Parameter beeinflussen?Alles was Sie brauchen ist:
oder, wenn Sie es für einen gesamten Controller deaktivieren möchten:
Trotz der Debatte in den Kommentaren hier reicht dies aus, um das Browser-Caching zu deaktivieren. Dies führt dazu, dass ASP.Net Antwortheader ausgibt, die dem Browser mitteilen, dass das Dokument sofort abläuft:
quelle
Cache-Control
aufpublic
max-age=0
hat nie "Cache deaktiviert" bedeutet. Dies bedeutet nur, dass der Antwortinhalt sofort als veraltet betrachtet wird , aber ein Cache darf ihn zwischenspeichern. Browser sollten die Aktualität des zwischengespeicherten veralteten Inhalts vor der Verwendung überprüfen. Dies ist jedoch nicht obligatorisch, es sei denn, die zusätzliche Richtliniemust-revalidate
ist angegeben.Fügen Sie in der Controller-Aktion die folgenden Zeilen an die Kopfzeile an
quelle
Hier ist das
NoCache
von mattytommo vorgeschlagene Attribut, das durch die Verwendung der Informationen aus Chris Moschinis Antwort vereinfacht wurde:quelle
max-age=0
hat nie "Cache deaktiviert" bedeutet. Dies bedeutet nur, dass der Antwortinhalt sofort als veraltet betrachtet wird , aber ein Cache darf ihn zwischenspeichern. Browser sollten die Aktualität des zwischengespeicherten veralteten Inhalts vor der Verwendung überprüfen. Dies ist jedoch nur dann obligatorisch, wenn die zusätzliche Richtliniemust-revalidate
angegeben ist.no-cache
, die weiterhin das Zwischenspeichern ermöglicht, jedoch vor jeder Verwendung eine erneute Validierung auf dem Ursprungsserver vorschreibt. Um zu vermeiden , sogar revalidiert Caching Sie müssen hinzufügenno-store
zusammen mitno-cache
. (no-store
allein ist eindeutig falsch, weil flüchtige Caches Inhalte zwischenspeichern dürfen, die als gekennzeichnet sindno-store
.)Für MVC6 ( DNX ) gibt es keine
System.Web.OutputCacheAttribute
Hinweis: Wenn Sie den
NoStore
Parameter Duration einstellen , wird dies nicht berücksichtigt. Es ist möglich, eine Anfangsdauer für die Erstregistrierung festzulegen und diese mit benutzerdefinierten Attributen zu überschreiben.Aber wir haben
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
Es ist möglich, den Anfangsfilter mit einem benutzerdefinierten Attribut zu überschreiben
Hier ist ein Anwendungsfall
quelle
Ausgabe-Caching in MVC
quelle
Der korrekte Attributwert für Asp.Net MVC Core , um das Zwischenspeichern von Browsern (einschließlich Internet Explorer 11 ) zu verhindern, lautet:
wie in der Microsoft-Dokumentation beschrieben:
Antwort-Caching in ASP.NET Core - NoStore und Location.None
quelle
ASP.NET MVC 5-Lösungen:
App_Start/FilterConfig.cs
‚s -RegisterGlobalFilters
Methode:OutputCache
Direktive aufController
oderView
auf einer anderen Ebene anwenden . Für normale Controller ist esoder wenn es ein ist
ApiController
, wäre esquelle