In der ASP.NET Core-Anwendung habe ich eine Aktionsmethode, die einige Daten zurückgibt. Ich wollte diese Daten zwischenspeichern auf Clientseite . Basierend auf dem Dokumentation hier kann ich das ResponseCache
-Attribut für die Aktionsmethode verwenden. Dieses Attribut fügt als Antwort den Cache-Control
-Header hinzu
Antwort-Caching bezieht sich auf das Angeben von Cache-bezogenen Headern in HTTP -Antworten, die von ASP.NET Core-MVC-Aktionen ausgeführt werden. Diese Header geben an, wie Sie möchten, dass Client- und Zwischenrechner (Proxy-Rechner) Antworten Auf bestimmte Anforderungen (wenn überhaupt) zwischenspeichern. Dadurch kann die Anzahl von -Anfragen, die ein Client oder Proxy an den Webserver stellt, reduziert werden, da zukünftige -Anforderungen für dieselbe Aktion möglicherweise aus dem -Cache des Clients oder Proxys ausgeführt werden.
ebenfalls
Bei der Zwischenspeicherung von Antworten werden die Antworten nicht auf dem Webserver zwischengespeichert. Unterscheidet sich vom Ausgabecaching, bei dem Antworten in Arbeitsspeicher auf dem Server in früheren Versionen von ASP.NET und ASP.NET MVC zwischengespeichert werden.
So sieht meine Aktionsmethode aus
public class LookupController : Controller
{
[HttpGet]
[ResponseCache(Duration = 120)]
public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
{
return _domain.GetStateProvinces();
}
}
Dann rufe ich die Methode mit dem Browser als http: // localhost: 40004/lookup/getstateprovinces Auf. Hier sind die Request- und Response-Header
Beachten Sie, dass der Antwortheader wie erwartet Cache-Control: public,max-age-120
hat. Wenn Sie jedoch die Seite mit F5 aktualisieren (vor 120 Sekunden), wird der Debugger-Haltepunkt in der GetStateProvince-Aktionsmethode immer angezeigt. Das bedeutet, dass die Daten nicht auf Kundenseite gespeichert werden.
Gibt es noch etwas, das ich tun muss, um das Zwischenspeichern auf Clientseite zu aktivieren?
Update Ich habe es mit IE, Chrome und POSTMAN ohne Erfolg versucht. Jedes Mal, wenn ich die URL in die Adressleiste eingebe oder auf "Aktualisieren" klicke, ruft der Client (Browser oder Postbote) eine Aktionsmethode auf.
Eigentlich arbeitet das Attribut ResponseCache wie beabsichtigt.
Der Unterschied besteht darin, dass die Antwort zwischengespeichert wird, wenn Sie durch die Seiten Ihrer Website navigieren ( case 1 ) oder die Vor- und Zurück-Schaltflächen verwenden ( nicht beim Aktualisieren der Seite ). .
Als Beispiel für Fall 1 habe ich Folgendes:
Wie Sie im Artikel Response Caching in ASP.Net Core 1.1 sehen werden, wird Folgendes angegeben:
Während einer Browsersitzung, Durchsuchen mehrerer Seiten innerhalb der Website oder Verwenden der Vor- und Zurück-Taste, um die Seiten zu besuchen, wird der Inhalt vom lokalen Browser-Cache (sofern nicht abgelaufen) bereitgestellt.
Wenn jedoch die Seite über F5 aktualisiert wird, wird die Anforderung an den Server gesendet, und der Seiteninhalt wird aktualisiert. Sie können dies über die erneuernde Kontaktseite mit F5 überprüfen.
Wenn Sie also F5 drücken, hat der Ablaufwert für die Zwischenspeicherung von Antworten keine Rolle für die Bereitstellung des Inhalts. Sie sollten 200 Antwort auf Kontaktanfrage sehen.
Verweise:
[1]. ASP.NET Core Response-Zwischenspeicherungsbeispiel
[2]. ResponseCache-Attributbeispiel
[3]: Wie kann das Zwischenspeichern von Webseiten über alle Browser gesteuert werden?
Um es kurz zu machen: Die Verwendung des ResponseCache
-Attributs wie dem folgenden ist ausreichend, um auslaufbasierte clientseitige Zwischenspeicherungen in einem brandneuen Standard-Dotnet-Kernprojekt (einschließlich async
-Methoden) zu verwenden:
[HttpGet]
[ResponseCache(Duration = 120)]
public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
{
return _domain.GetStateProvinces();
}
Dies funktioniert im obigen Screenshot korrekt, da der Cache-Control: public,max-age=120
dort sichtbar ist. In den meisten Fällen senden Browser keine nachfolgenden Anforderungen vor Ablauf (d. H. Für die nächsten 120 Sekunden oder 2 Minuten). Dies ist jedoch eine Entscheidung des Browsers (oder eines anderen Clients).
Wenn die Anforderung ist gesendet wurde, haben Sie entweder eine Middleware- oder eine Serverkonfiguration, die Ihre Antwortheader überschreibt, oder Ihr Client ignoriert die Zwischenspeicherungsanweisung. In der Abbildung oben ignoriert der Client das Caching, da der Cache-Steuerungsheader vorhanden ist.
Häufige Fälle, in denen der Clientcache ignoriert und die Anforderung gesendet wird:
Cache-Control: no-cache
Cache-Control: max-age=0
(dies ist in Ihrem Screenshot sichtbar)Cache-Control: no-cache
-Header, wodurch der lokale Cache umgangen wird, sodass Anforderungen gesendet werden. Sie können es im Einstellungsdialogfeld deaktivieren. In diesem Fall werden Anforderungen nicht mehr mit der obigen Client-Cache-Konfiguration gesendetAn diesem Punkt sind wir nicht mehr auf das Verfallsdatum von Client-Caching beschränkt, und der Server will empfängt die Anforderung auf die eine oder andere Weise, und eine andere Caching-Schicht tritt auf: Sie können den Server dazu veranlassen, mit einem 304 Not Modified
-Code (der Es liegt dann wieder am Client, die Interpretation in beliebiger Weise durchzuführen) oder einen serverseitigen Cache zu verwenden und mit dem vollen Inhalt zu antworten. Oder Sie verwenden keine nachfolgende Zwischenspeicherung und führen einfach die gesamte Anforderungsverarbeitung erneut auf dem Server durch.
Hinweis: Das ResponseCache
-Attribut ist in der Startkonfiguration nicht mit der services.AddResponseCaching()
& app.UseResponseCaching()
-Middleware zu verwechseln, da dies für das serverseitige Caching gilt (das standardmäßig einen In-Memory-Cache verwendet, wenn die Middleware verwendet wird) Damit das Client-Caching nicht funktioniert, ist das Attribut allein ausreichend.