wake-up-neo.com

Das ResponseCache-Attribut speichert keine Daten auf der Clientseite

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

enter image description here

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.

13
LP13

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?

9
Michael

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:

  • Chrome verhindert jede Art von Zwischenspeicherung, wenn HTTPS ohne Zertifikat verwendet wird (oder ein ungültiges Zertifikat; dies ist häufig in der lokalen Entwicklung üblich. Stellen Sie daher sicher, dass Sie beim Testen des Caches HTTP verwenden oder einem selbstsignierten Zertifikat vertrauen.)
  • Die meisten Browser-Entwickler-Tools deaktivieren das Caching standardmäßig, wenn sie geöffnet sind. Dies kann deaktiviert werden.
    • Browser senden normalerweise zusätzliche Header, Chrome sendet Cache-Control: no-cache
  • Direktes Aktualisieren (d. H. F5) weist die meisten Browser an, keinen Cache zu verwenden und die Anforderung unabhängig vom Alter zu stellen
    • Browser senden normalerweise zusätzliche Header, Chrome sendet Cache-Control: max-age=0 (dies ist in Ihrem Screenshot sichtbar)
  • Postman sendet den 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 gesendet

An 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.

0
John Weisz