Zwischenspeichern von Antworten in ASP.net CoreResponse caching in ASP.NET Core

Von John Luo, Rick Andersonund Steve SmithBy John Luo, Rick Anderson, and Steve Smith

Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)View or download sample code (how to download)

Beim Zwischenspeichern von Antworten wird die Anzahl von Anforderungen reduziert, die ein Client oder Proxy an einen Webserver sendet.Response caching reduces the number of requests a client or proxy makes to a web server. Durch das Zwischenspeichern von Antworten wird auch der Arbeitsaufwand reduziert, der vom Webserver zum Generieren einer Antwort ausgeführt wird.Response caching also reduces the amount of work the web server performs to generate a response. Das Zwischenspeichern von Antworten wird durch Header gesteuert, die angeben, wie die Client-, Proxy-und Middleware Antworten zwischenspeichern soll.Response caching is controlled by headers that specify how you want client, proxy, and middleware to cache responses.

Das responsecache-Attribut nimmt an der Einstellung von Cache Headern für Antworten Teil.The ResponseCache attribute participates in setting response caching headers. Clients und zwischen Proxys sollten die Header zum Zwischenspeichern von Antworten unter der http 1,1-cachingspezifikationberücksichtigen.Clients and intermediate proxies should honor the headers for caching responses under the HTTP 1.1 Caching specification.

Verwenden Sie für die serverseitige Zwischenspeicherung, die der HTTP 1,1-Cache Spezifikation folgt, die Middleware zum Zwischenspeichern von Antworten.For server-side caching that follows the HTTP 1.1 Caching specification, use Response Caching Middleware. Die Middleware kann die ResponseCacheAttribute Eigenschaften verwenden, um das serverseitige zwischen Speicherungs Verhalten zu beeinflussen.The middleware can use the ResponseCacheAttribute properties to influence server-side caching behavior.

HTTP-basiertes Zwischenspeichern von AntwortenHTTP-based response caching

In der http 1,1-cachingspezifikation wird beschrieben, wie sich die Internet Caches Verhalten.The HTTP 1.1 Caching specification describes how Internet caches should behave. Der primäre HTTP-Header, der zum Zwischenspeichern verwendet wird, ist Cache-Control, der zum Angeben von Cache Anweisungen verwendet wird.The primary HTTP header used for caching is Cache-Control, which is used to specify cache directives . Die Direktiven steuern das zwischen Speicherungs Verhalten, da Anforderungen von Clients auf Server und Antworten von Servern an Clients zurückgeben.The directives control caching behavior as requests make their way from clients to servers and as responses make their way from servers back to clients. Anforderungen und Antworten werden durch Proxy Server verschoben, und Proxy Server müssen ebenfalls der HTTP 1,1-cachingspezifikation entsprechen.Requests and responses move through proxy servers, and proxy servers must also conform to the HTTP 1.1 Caching specification.

Allgemeine Cache-Control Anweisungen sind in der folgenden Tabelle aufgeführt.Common Cache-Control directives are shown in the following table.

AnweisungDirective AktionAction
öffentlichpublic Die Antwort kann in einem Cache gespeichert werden.A cache may store the response.
privateprivate Die Antwort darf nicht von einem freigegebenen Cache gespeichert werden.The response must not be stored by a shared cache. In einem privaten Cache kann die Antwort gespeichert und wieder verwendet werden.A private cache may store and reuse the response.
Max-agemax-age Der Client akzeptiert keine Antwort, deren Alter größer ist als die angegebene Anzahl von Sekunden.The client doesn't accept a response whose age is greater than the specified number of seconds. Beispiele: max-age=60 (60 Sekunden), max-age=2592000 (1 Monat)Examples: max-age=60 (60 seconds), max-age=2592000 (1 month)
No-Cacheno-cache Bei Anforderungen : ein Cache darf keine gespeicherte Antwort verwenden, um die Anforderung zu erfüllen.On requests : A cache must not use a stored response to satisfy the request. Der Ursprungsserver generiert die Antwort für den Client erneut, und die Middleware aktualisiert die gespeicherte Antwort im Cache.The origin server regenerates the response for the client, and the middleware updates the stored response in its cache.

Bei Antworten : die Antwort darf nicht für eine nachfolgende Anforderung ohne Validierung auf dem Ursprungsserver verwendet werden.On responses : The response must not be used for a subsequent request without validation on the origin server.
No-Storeno-store Bei Anforderungen : die Anforderung darf nicht in einem Cache gespeichert werden.On requests : A cache must not store the request.

Bei Antworten : ein Cache darf keinen Teil der Antwort speichern.On responses : A cache must not store any part of the response.

Andere Cache Header, die eine Rolle beim Caching spielen, sind in der folgenden Tabelle aufgeführt.Other cache headers that play a role in caching are shown in the following table.

HeaderHeader FunktionFunction
Age (Alter)Age Eine Schätzung der Zeitspanne (in Sekunden), seit die die Antwort auf dem Ursprungsserver generiert oder erfolgreich überprüft wurde.An estimate of the amount of time in seconds since the response was generated or successfully validated at the origin server.
LaufzeitExpires Die Zeit, nach der die Antwort als veraltet eingestuft wird.The time after which the response is considered stale.
PragmaPragma Besteht aus Gründen der Abwärtskompatibilität mit HTTP/1.0-Caches zum Festlegen des no-cache Verhaltens.Exists for backwards compatibility with HTTP/1.0 caches for setting no-cache behavior. Wenn der Cache-Control Header vorhanden ist, Pragma wird der Header ignoriert.If the Cache-Control header is present, the Pragma header is ignored.
AbweichenVary Gibt an, dass eine zwischengespeicherte Antwort nicht gesendet werden darf, es sei denn, alle Vary Header Felder stimmen mit der ursprünglichen Anforderung der zwischengespeicherten Antwort und der neuen Anforderung gleich.Specifies that a cached response must not be sent unless all of the Vary header fields match in both the cached response's original request and the new request.

HTTP-basiertes Zwischenspeichern von Anforderungen Cache-Control DirektivenHTTP-based caching respects request Cache-Control directives

Die http 1,1-Cache Spezifikation für den Cache-Control-Header erfordert, dass ein Cache einen gültigen Header berücksichtigt, Cache-Control der vom Client gesendet wird.The HTTP 1.1 Caching specification for the Cache-Control header requires a cache to honor a valid Cache-Control header sent by the client. Ein Client kann Anforderungen mit einem no-cache Header Wert senden und erzwingen, dass der Server eine neue Antwort für jede Anforderung generiert.A client can make requests with a no-cache header value and force the server to generate a new response for every request.

Cache-ControlWenn Sie das Ziel der HTTP-Zwischenspeicherung in Erwägung gezogen haben, ist es sinnvoll, Client Anforderungs Header zu berücksichtigen.Always honoring client Cache-Control request headers makes sense if you consider the goal of HTTP caching. Unter der offiziellen Spezifikation soll das Caching die Latenz und den Netzwerk Aufwand bei der Erfüllung von Anforderungen in einem Netzwerk von Clients, Proxys und Servern reduzieren.Under the official specification, caching is meant to reduce the latency and network overhead of satisfying requests across a network of clients, proxies, and servers. Es ist nicht notwendigerweise eine Möglichkeit, die Last auf einem Ursprungsserver zu steuern.It isn't necessarily a way to control the load on an origin server.

Es gibt keine Entwickler Kontrolle über dieses zwischen Speicherungs Verhalten, wenn die Middleware zum Zwischenspeichern von Antworten verwendet wird, da die Middleware die offizielle cachingspezifikation befolgt.There's no developer control over this caching behavior when using the Response Caching Middleware because the middleware adheres to the official caching specification. Geplante Erweiterungen der Middleware sind die Möglichkeit, die Middleware so zu konfigurieren, dass der Header einer Anforderung ignoriert wird, Cache-Control Wenn eine zwischengespeicherte Antwort verarbeitet wird.Planned enhancements to the middleware are an opportunity to configure the middleware to ignore a request's Cache-Control header when deciding to serve a cached response. Geplante Erweiterungen bieten die Möglichkeit, die Serverlast besser zu steuern.Planned enhancements provide an opportunity to better control server load.

Andere cachingtechnologie in ASP.net CoreOther caching technology in ASP.NET Core

In-Memory-CachingIn-memory caching

In-Memory-Caching verwendet Server Arbeitsspeicher zum Speichern von zwischengespeicherten Daten.In-memory caching uses server memory to store cached data. Diese Art der Zwischenspeicherung eignet sich für einen einzelnen Server oder mehrere Server, die persistente Sitzungen verwenden.This type of caching is suitable for a single server or multiple servers using sticky sessions . Mit "persistente Sitzungen" können die Anforderungen von einem Client für die Verarbeitung immer an denselben Server weitergeleitet werden.Sticky sessions means that the requests from a client are always routed to the same server for processing.

Weitere Informationen finden Sie unter Speicher interne Speicherung in ASP.net Core.For more information, see Speicher interne Speicherung in ASP.net Core.

Verteilter CacheDistributed Cache

Verwenden Sie einen verteilten Cache, um Daten im Arbeitsspeicher zu speichern, wenn die app in einer Cloud-oder Serverfarm gehostet wird.Use a distributed cache to store data in memory when the app is hosted in a cloud or server farm. Der Cache wird auf den Servern freigegeben, die Anforderungen verarbeiten.The cache is shared across the servers that process requests. Ein Client kann eine Anforderung übermitteln, die von einem beliebigen Server in der Gruppe verarbeitet wird, wenn zwischengespeicherte Daten für den Client verfügbar sind.A client can submit a request that's handled by any server in the group if cached data for the client is available. ASP.net Core funktioniert mit verteilten Caches SQL Server, redisund NCache .ASP.NET Core works with SQL Server, Redis, and NCache distributed caches.

Weitere Informationen finden Sie unter Verteiltes Zwischenspeichern in ASP.net Core.For more information, see Verteiltes Zwischenspeichern in ASP.net Core.

Cache-TaghilfsprogrammCache Tag Helper

Zwischenspeichern des Inhalts aus einer MVC-Ansicht oder- Razor Seite mit dem cachetaghilfsprogramm.Cache the content from an MVC view or Razor Page with the Cache Tag Helper. Das Cache-taghilfsprogramm verwendet das Zwischenspeichern im Arbeitsspeicher zum Speichern von Daten.The Cache Tag Helper uses in-memory caching to store data.

Weitere Informationen finden Sie unter Cache-Taghilfsprogramm im ASP.NET Core MVC.For more information, see Cache-Taghilfsprogramm im ASP.NET Core MVC.

Taghilfsprogramm für verteilten CacheDistributed Cache Tag Helper

Zwischenspeichern des Inhalts aus einer MVC-Ansicht oder- Razor Seite in verteilten Cloud-oder Webfarm Szenarios mit dem taghilfsprogramm für verteilte Caches.Cache the content from an MVC view or Razor Page in distributed cloud or web farm scenarios with the Distributed Cache Tag Helper. Das taghilfsprogramm für verteilte Caches verwendet SQL Server, redisoder NCache zum Speichern von Daten.The Distributed Cache Tag Helper uses SQL Server, Redis, or NCache to store data.

Weitere Informationen finden Sie unter Taghilfsprogramm für verteilten Cache in ASP.NET Core.For more information, see Taghilfsprogramm für verteilten Cache in ASP.NET Core.

Response Cache-AttributResponseCache attribute

Der ResponseCacheAttribute gibt die Parameter an, die zum Festlegen geeigneter Header beim Zwischenspeichern von Antworten erforderlich sind.The ResponseCacheAttribute specifies the parameters necessary for setting appropriate headers in response caching.

Warnung

Deaktivieren Sie das Zwischenspeichern für Inhalte, die Informationen für authentifizierte Clients enthalten.Disable caching for content that contains information for authenticated clients. Das Zwischenspeichern sollte nur für Inhalt aktiviert werden, der sich nicht auf der Grundlage der Identität eines Benutzers ändert, oder ob ein Benutzer angemeldet ist.Caching should only be enabled for content that doesn't change based on a user's identity or whether a user is signed in.

VaryByQueryKeys variiert die gespeicherte Antwort anhand der Werte der angegebenen Liste von Abfrage Schlüsseln.VaryByQueryKeys varies the stored response by the values of the given list of query keys. Wenn ein einzelner Wert * bereitgestellt wird, variiert die Middleware mit den Antworten aller Parameter der Anforderungs Abfrage Zeichenfolge.When a single value of * is provided, the middleware varies responses by all request query string parameters.

Die Middleware zum Zwischenspeichern von Antworten muss aktiviert sein, um die Eigenschaft festzulegen VaryByQueryKeys .Response Caching Middleware must be enabled to set the VaryByQueryKeys property. Andernfalls wird eine Lauf Zeit Ausnahme ausgelöst.Otherwise, a runtime exception is thrown. Es gibt keinen entsprechenden HTTP-Header für die- VaryByQueryKeys Eigenschaft.There isn't a corresponding HTTP header for the VaryByQueryKeys property. Die-Eigenschaft ist eine HTTP-Funktion, die von der zwischenware zum Zwischenspeichern von AntwortenThe property is an HTTP feature handled by Response Caching Middleware. Damit die Middleware eine zwischengespeicherte Antwort bereitstellt, müssen die Abfrage Zeichenfolge und der Abfrage Zeichenfolgen-Wert mit einer vorherigen Anforderung identisch sein.For the middleware to serve a cached response, the query string and query string value must match a previous request. Stellen Sie sich z. b. die Abfolge der in der folgenden Tabelle gezeigten Anforderungen und Ergebnisse vor.For example, consider the sequence of requests and results shown in the following table.

AnforderungRequest ErgebnisResult
http://example.com?key1=value1 Vom Server zurückgegeben.Returned from the server.
http://example.com?key1=value1 Von der Middleware zurückgegeben.Returned from middleware.
http://example.com?key1=value2 Vom Server zurückgegeben.Returned from the server.

Die erste Anforderung wird vom Server zurückgegeben und in der Middleware zwischengespeichert.The first request is returned by the server and cached in middleware. Die zweite Anforderung wird von Middleware zurückgegeben, da die Abfrage Zeichenfolge mit der vorherigen Anforderung übereinstimmt.The second request is returned by middleware because the query string matches the previous request. Die dritte Anforderung befindet sich nicht im middlewarecache, da der Wert der Abfrage Zeichenfolge mit einer vorherigen Anforderung nicht identisch ist.The third request isn't in the middleware cache because the query string value doesn't match a previous request.

ResponseCacheAttributeWird verwendet, um (via) zu konfigurieren und zu erstellen IFilterFactory Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter .The ResponseCacheAttribute is used to configure and create (via IFilterFactory) a Microsoft.AspNetCore.Mvc.Internal.ResponseCacheFilter. Der ResponseCacheFilter führt die Aktualisierung der entsprechenden HTTP-Header und Features der Antwort aus.The ResponseCacheFilter performs the work of updating the appropriate HTTP headers and features of the response. Der Filter:The filter:

  • Entfernt alle vorhandenen Header für Vary , Cache-Control und Pragma .Removes any existing headers for Vary, Cache-Control, and Pragma.
  • Schreibt die entsprechenden Header auf der Grundlage der im festgelegten Eigenschaften ResponseCacheAttribute .Writes out the appropriate headers based on the properties set in the ResponseCacheAttribute.
  • Aktualisiert das HTTP-Feature zum Zwischenspeichern von Antworten, wenn VaryByQueryKeys festgelegt istUpdates the response caching HTTP feature if VaryByQueryKeys is set.

AbweichenVary

Dieser Header wird nur geschrieben, wenn die- VaryByHeader Eigenschaft festgelegt wird.This header is only written when the VaryByHeader property is set. Die Eigenschaft, die auf den Wert der Eigenschaft festgelegt Vary ist.The property set to the Vary property's value. Im folgenden Beispiel wird die- VaryByHeader Eigenschaft verwendet:The following sample uses the VaryByHeader property:

[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)]
public class Cache1Model : PageModel
{

Verwenden Sie die Beispiel-APP, um die Antwortheader mit den Netzwerk Tools des Browsers anzuzeigen.Using the sample app, view the response headers with the browser's network tools. Die folgenden Antwortheader werden mit der Cache1-Seiten Antwort gesendet:The following response headers are sent with the Cache1 page response:

Cache-Control: public,max-age=30
Vary: User-Agent

NoStore und Location. NoneNoStore and Location.None

NoStore überschreibt die meisten anderen Eigenschaften.NoStore overrides most of the other properties. Wenn diese Eigenschaft auf festgelegt ist true , Cache-Control wird der-Header auf festgelegt no-store .When this property is set to true, the Cache-Control header is set to no-store. Wenn Location auf festgelegt ist None :If Location is set to None:

  • Für Cache-Control ist no-store,no-cache festgelegt.Cache-Control is set to no-store,no-cache.
  • Für Pragma ist no-cache festgelegt.Pragma is set to no-cache.

Wenn NoStore false den Wert Location hat und den Wert None , Cache-Control und Pragma auf festgelegt ist no-cache .If NoStore is false and Location is None, Cache-Control, and Pragma are set to no-cache.

NoStore wird in der Regel true für Fehlerseiten auf festgelegt.NoStore is typically set to true for error pages. Die Cache2-Seite in der Beispiel-app erzeugt Antwortheader, die den Client anweisen, die Antwort nicht zu speichern.The Cache2 page in the sample app produces response headers that instruct the client not to store the response.

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class Cache2Model : PageModel
{

Die Beispiel-App gibt die Cache2-Seite mit den folgenden Headern zurück:The sample app returns the Cache2 page with the following headers:

Cache-Control: no-store,no-cache
Pragma: no-cache

Speicherort und DauerLocation and Duration

Um das Zwischenspeichern zu aktivieren, Duration muss auf einen positiven Wert festgelegt werden und Location muss entweder Any (Standard) oder sein Client .To enable caching, Duration must be set to a positive value and Location must be either Any (the default) or Client. Das Framework legt den- Cache-Control Header auf den Speicherort Wert fest, gefolgt vom max-age der Antwort.The framework sets the Cache-Control header to the location value followed by the max-age of the response.

Locationdie Optionen von Any und Client werden in Cache-Control Header Werte von public private bzw. übersetzt.Location's options of Any and Client translate into Cache-Control header values of public and private, respectively. Wie im Abschnitt NoStore und Location. None vermerkt, legt das Festlegen Location von auf None sowohl Cache-Control -als auch- Pragma Header auf fest no-cache .As noted in the NoStore and Location.None section, setting Location to None sets both Cache-Control and Pragma headers to no-cache.

Location.Any( Cache-Control festgelegt auf public ) gibt an, dass der Wert des Clients oder eines beliebigen zwischen Proxys zwischen gespeichert werden kann, einschließlich der Zwischenspeicherung von zwischen SpeichernLocation.Any (Cache-Control set to public) indicates that the client or any intermediate proxy may cache the value, including Response Caching Middleware.

Location.Client ( Cache-Control festgelegt auf private ) gibt an, dass der Wert nur vom Client zwischengespeichert werden darf.Location.Client (Cache-Control set to private) indicates that only the client may cache the value. Der Wert kann nicht zwischengespeichert werden, einschließlich der Middlewarezum Zwischenspeichern von Antworten.No intermediate cache should cache the value, including Response Caching Middleware.

Cache Steuerungs Header bieten lediglich Anleitungen für Clients und Vermittler Proxys, wann und wie Antworten zwischengespeichert werden.Cache control headers merely provide guidance to clients and intermediary proxies when and how to cache responses. Es gibt keine Garantie dafür, dass Clients und Proxys die http 1,1-cachingspezifikationberücksichtigen.There's no guarantee that clients and proxies will honor the HTTP 1.1 Caching specification. Die Middleware zum Zwischenspeichern von Antworten folgt immer den durch die Spezifikation vorgegebenen Cache Regeln.Response Caching Middleware always follows the caching rules laid out by the specification.

Das folgende Beispiel zeigt das Cache3 Page Model aus der Beispiel-APP und die über das Festlegen Duration und belassen des Standard Location Werts erstellten Header:The following example shows the Cache3 page model from the sample app and the headers produced by setting Duration and leaving the default Location value:

[ResponseCache(Duration = 10, Location = ResponseCacheLocation.Any, NoStore = false)]
public class Cache3Model : PageModel
{

Die Beispiel-App gibt die Cache3-Seite mit dem folgenden Header zurück:The sample app returns the Cache3 page with the following header:

Cache-Control: public,max-age=10

Cache profileCache profiles

Anstatt die Einstellungen des Antwort Caches für viele Controller Aktions Attribute zu duplizieren, können Cache Profile beim Einrichten von MVC/pages in als Optionen konfiguriert werden Razor Startup.ConfigureServices .Instead of duplicating response cache settings on many controller action attributes, cache profiles can be configured as options when setting up MVC/Razor Pages in Startup.ConfigureServices. Werte, die in einem Cache Profil gefunden werden, auf das verwiesen wird, werden als Standardwerte verwendet ResponseCacheAttribute und von allen Eigenschaften überschrieben, die für das Attribut angegeben sind.Values found in a referenced cache profile are used as the defaults by the ResponseCacheAttribute and are overridden by any properties specified on the attribute.

Einrichten eines Cache Profils.Set up a cache profile. Das folgende Beispiel zeigt ein Cache Profil mit 30 Sekunden in der Beispiel-APP Startup.ConfigureServices :The following example shows a 30 second cache profile in the sample app's Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Default30",
            new CacheProfile()
            {
                Duration = 30
            });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.CacheProfiles.Add("Default30",
            new CacheProfile()
            {
                Duration = 30
            });
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Das Cache4-Seiten Modell der Beispiel-App verweist auf das Default30 Cache Profil:The sample app's Cache4 page model references the Default30 cache profile:

[ResponseCache(CacheProfileName = "Default30")]
public class Cache4Model : PageModel
{

ResponseCacheAttributeKann angewendet werden auf:The ResponseCacheAttribute can be applied to:

  • Razor Pages: Attribute können nicht auf Handlermethoden angewendet werden.Razor Pages: Attributes can't be applied to handler methods.
  • MVC-Controller.MVC controllers.
  • MVC-Aktionsmethoden: Attribute auf Methoden Ebene überschreiben die in Attributen auf Klassenebene angegebenen Einstellungen.MVC action methods: Method-level attributes override the settings specified in class-level attributes.

Der resultierende Header, der für die Antwort auf die Cache4-Seite vom Default30 Cache Profil übernommen wird:The resulting header applied to the Cache4 page response by the Default30 cache profile:

Cache-Control: public,max-age=30

Zusätzliche RessourcenAdditional resources