Zwischen Speicherungs Middleware für Antworten in ASP.net CoreResponse Caching Middleware in ASP.NET Core

Von John LuoBy John Luo

In diesem Artikel wird erläutert, wie Sie die Zwischenspeicherung von Antwort Caching in einer ASP.net Core-App konfigurieren.This article explains how to configure Response Caching Middleware in an ASP.NET Core app. Die Middleware bestimmt, wann Antworten zwischengespeichert werden können, speichert Antworten und verarbeitet Antworten aus dem Cache.The middleware determines when responses are cacheable, stores responses, and serves responses from cache. Eine Einführung in das http-Caching und das-Attribut finden Sie unter zwischen [ResponseCache] Speichern von Antworten.For an introduction to HTTP caching and the [ResponseCache] attribute, see Response Caching.

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

KonfigurationConfiguration

Die Middleware zum Zwischenspeichern von Antworten ist für ASP.net Core-apps implizit über das freigegebene Framework verfügbar.Response Caching Middleware is implicitly available for ASP.NET Core apps via the shared framework.

Startup.ConfigureServicesFügen Sie in der Dienst Sammlung die Middleware zum Zwischenspeichern von Antworten hinzu:In Startup.ConfigureServices, add the Response Caching Middleware to the service collection:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCaching();
    services.AddRazorPages();
}

Konfigurieren Sie die APP für die Verwendung der Middleware mit der- UseResponseCaching Erweiterungsmethode, mit der die Middleware der Pipeline für die Anforderungs Verarbeitung in hinzugefügt wird Startup.Configure :Configure the app to use the middleware with the UseResponseCaching extension method, which adds the middleware to the request processing pipeline in Startup.Configure:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();
    app.UseRouting();
    // UseCors must be called before UseResponseCaching
    // app.UseCors("myAllowSpecificOrigins");

    app.UseResponseCaching();

    app.Use(async (context, next) =>
    {
        context.Response.GetTypedHeaders().CacheControl = 
            new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
            {
                Public = true,
                MaxAge = TimeSpan.FromSeconds(10)
            };
        context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = 
            new string[] { "Accept-Encoding" };

        await next();
    });

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Warnung

UseCorsmuss vor UseResponseCaching der Verwendung von cors-Middlewareaufgerufen werden.UseCors must be called before UseResponseCaching when using CORS middleware.

Die Beispiel-App Fügt Header zum Steuern der Zwischenspeicherung bei nachfolgenden Anforderungen hinzu:The sample app adds headers to control caching on subsequent requests:

  • Cache-Control: speichert zwischen speicherbare Antworten bis zu 10 Sekunden.Cache-Control: Caches cacheable responses for up to 10 seconds.
  • Vary: konfiguriert die Middleware so, dass Sie nur dann eine zwischengespeicherte Antwort bedient, wenn der Accept-Encoding- Header der nachfolgenden Anforderungen mit der ursprünglichen Anforderung übereinstimmt.Vary: Configures the middleware to serve a cached response only if the Accept-Encoding header of subsequent requests matches that of the original request.
// using Microsoft.AspNetCore.Http;

app.Use(async (context, next) =>
{
    context.Response.GetTypedHeaders().CacheControl = 
        new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
        {
            Public = true,
            MaxAge = TimeSpan.FromSeconds(10)
        };
    context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = 
        new string[] { "Accept-Encoding" };

    await next();
});

Die vorangehenden Header werden nicht in die Antwort geschrieben und überschrieben, wenn ein Controller, eine Aktion oder eine Razor Seite:The preceding headers are not written to the response and are overridden when a controller, action, or Razor Page:

  • Verfügt über ein [Response Cache] -Attribut.Has a [ResponseCache] attribute. Dies gilt auch, wenn eine Eigenschaft nicht festgelegt ist.This applies even if a property isn't set. Wenn Sie z. b. die VaryByHeader -Eigenschaft weglassen, bewirkt dies, dass der entsprechende Header aus der Antwort entfernt wird.For example, omitting the VaryByHeader property will cause the corresponding header to be removed from the response.

Die Middleware zum Zwischenspeichern von Antworten speichert nur Server Antworten zwischen, die zu einem 200 (OK)-Statuscode führen.Response Caching Middleware only caches server responses that result in a 200 (OK) status code. Alle anderen Antworten, einschließlich der Fehlerseiten, werden von der Middleware ignoriert.Any other responses, including error pages, are ignored by the middleware.

Warnung

Antworten, die Inhalte für authentifizierte Clients enthalten, müssen als nicht zwischen speicherbar gekennzeichnet werden, um zu verhindern, dass die Middleware diese Antworten speichert und bedient.Responses containing content for authenticated clients must be marked as not cacheable to prevent the middleware from storing and serving those responses. Ausführliche Informationen dazu, wie die Middleware festlegt, ob eine Antwort zwischengespeichert werden kann, finden Sie unter Bedingungen für das Caching .See Conditions for caching for details on how the middleware determines if a response is cacheable.

OptionenOptions

Die Optionen zum Zwischenspeichern von Antworten sind in der folgenden Tabelle aufgeführt.Response caching options are shown in the following table.

OptionOption BESCHREIBUNGDescription
MaximumBodySize Die größte zwischen speicherbare Größe für den Antworttext in Bytes.The largest cacheable size for the response body in bytes. Der Standardwert ist 64 * 1024 * 1024 (64 MB).The default value is 64 * 1024 * 1024 (64 MB).
SizeLimit Die Größenbeschränkung für die Antwort Cache-Middleware in Bytes.The size limit for the response cache middleware in bytes. Der Standardwert ist 100 * 1024 * 1024 (100 MB).The default value is 100 * 1024 * 1024 (100 MB).
UseCaseSensitivePaths Bestimmt, ob Antworten bei Pfaden zwischen Groß-und Kleinschreibung zwischengespeichert werden.Determines if responses are cached on case-sensitive paths. Der Standardwert ist false.The default value is false.

Im folgenden Beispiel wird die Middleware wie folgt konfiguriert:The following example configures the middleware to:

  • Zwischenspeichern von Antworten mit einer Textgröße, die kleiner oder gleich 1.024 Bytes ist.Cache responses with a body size smaller than or equal to 1,024 bytes.
  • Speichert die Antworten nach Pfaden mit Unterscheidung nach Groß-/KleinschreibungStore the responses by case-sensitive paths. Beispielsweise /page1 werden und /Page1 separat gespeichert.For example, /page1 and /Page1 are stored separately.
services.AddResponseCaching(options =>
{
    options.MaximumBodySize = 1024;
    options.UseCaseSensitivePaths = true;
});

VarybyquerykeysVaryByQueryKeys

Bei Verwendung von MVC/Web-API-Controllern oder Razor Seiten Modellen gibt das- [ResponseCache] Attribut die Parameter an, die zum Festlegen der entsprechenden Header für das Zwischenspeichern von Antworten erforderlich sind.When using MVC / web API controllers or Razor Pages page models, the [ResponseCache] attribute specifies the parameters necessary for setting the appropriate headers for response caching. Der einzige Parameter des [ResponseCache] Attributs, der die Middleware strikt erfordert VaryByQueryKeys , ist, was keinem tatsächlichen HTTP-Header entspricht.The only parameter of the [ResponseCache] attribute that strictly requires the middleware is VaryByQueryKeys, which doesn't correspond to an actual HTTP header. Weitere Informationen finden Sie unter Zwischenspeichern von Antworten in ASP.net Core.For more information, see Zwischenspeichern von Antworten in ASP.net Core.

Wenn das-Attribut nicht verwendet wird [ResponseCache] , kann das Zwischenspeichern von Antworten mit variiert werden VaryByQueryKeys .When not using the [ResponseCache] attribute, response caching can be varied with VaryByQueryKeys. Verwenden Sie das ResponseCachingFeature direkt aus HttpContext. Features:Use the ResponseCachingFeature directly from the HttpContext.Features:

var responseCachingFeature = context.HttpContext.Features.Get<IResponseCachingFeature>();

if (responseCachingFeature != null)
{
    responseCachingFeature.VaryByQueryKeys = new[] { "MyKey" };
}

Durch die Verwendung eines einzelnen Werts * VaryByQueryKeys von in variiert der Cache von allen Anforderungs Abfrage Parametern.Using a single value equal to * in VaryByQueryKeys varies the cache by all request query parameters.

HTTP-Header, die von der zwischenware zum ZwischenspeichernHTTP headers used by Response Caching Middleware

Die folgende Tabelle enthält Informationen über HTTP-Header, die sich auf das Zwischenspeichern von Antworten auswirkenThe following table provides information on HTTP headers that affect response caching.

HeaderHeader DetailsDetails
Authorization Die Antwort wird nicht zwischengespeichert, wenn der Header vorhanden ist.The response isn't cached if the header exists.
Cache-Control Die Middleware berücksichtigt nur zwischen Speicherungs Antworten, die mit der public Cache Direktive gekennzeichnet sind.The middleware only considers caching responses marked with the public cache directive. Steuern Sie die Zwischenspeicherung mit den folgenden Parametern:Control caching with the following parameters:
  • Max-agemax-age
  • Max-veralteter†max-stale†
  • min-Freshmin-fresh
  • must-revalidatemust-revalidate
  • Kein Cacheno-cache
  • No-Storeno-store
  • nur-if-Cacheonly-if-cached
  • Privatprivate
  • öffentlichpublic
  • s-maxages-maxage
  • proxy-revalidate‡proxy-revalidate‡
†wenn kein Limit für angegeben ist max-stale , führt die Middleware keine Aktion aus.†If no limit is specified to max-stale, the middleware takes no action.
proxy-revalidate hat dieselbe Wirkung wie must-revalidate .proxy-revalidate has the same effect as must-revalidate.

Weitere Informationen finden Sie unter RFC 7231: Anfordern von Cache-Control-Direktiven.For more information, see RFC 7231: Request Cache-Control Directives.
Pragma Ein- Pragma: no-cache Header in der Anforderung erzeugt denselben Effekt wie Cache-Control: no-cache .A Pragma: no-cache header in the request produces the same effect as Cache-Control: no-cache. Dieser Header wird durch die relevanten Direktiven im Header überschrieben Cache-Control , sofern vorhanden.This header is overridden by the relevant directives in the Cache-Control header, if present. Wird aus Gründen der Abwärtskompatibilität mit HTTP/1.0 berücksichtigt.Considered for backward compatibility with HTTP/1.0.
Set-Cookie Die Antwort wird nicht zwischengespeichert, wenn der Header vorhanden ist.The response isn't cached if the header exists. Jede Middleware in der Anforderungs Verarbeitungs Pipeline, mit der ein oder mehrere s festgelegt werden, verhindert, dass cookie die Antwort zwischen speichernde Middleware die Antwort zwischenspeichert (z. b. dem cookie -basierten TempData-Anbieter).Any middleware in the request processing pipeline that sets one or more cookies prevents the Response Caching Middleware from caching the response (for example, the cookie-based TempData provider).
Vary Der- Vary Header wird verwendet, um die zwischengespeicherte Antwort von einem anderen Header zu verändern.The Vary header is used to vary the cached response by another header. Beispielsweise können Sie Antworten durch die Codierung Zwischenspeichern, indem Sie den Vary: Accept-Encoding -Header einschließen, der Antworten für Anforderungen mit Headern Accept-Encoding: gzip und separat zwischenspeichert Accept-Encoding: text/plain .For example, cache responses by encoding by including the Vary: Accept-Encoding header, which caches responses for requests with headers Accept-Encoding: gzip and Accept-Encoding: text/plain separately. Eine Antwort mit dem-Header Wert * wird nie gespeichert.A response with a header value of * is never stored.
Expires Eine Antwort, die von diesem Header als veraltet eingestuft wird, wird nur dann gespeichert oder abgerufen, wenn Sie von anderen Cache-Control HeadernA response deemed stale by this header isn't stored or retrieved unless overridden by other Cache-Control headers.
If-None-Match Die vollständige Antwort wird aus dem Cache bereitgestellt, wenn der Wert nicht ist, * und die ETag der Antwort entspricht keinem der angegebenen Werte.The full response is served from cache if the value isn't * and the ETag of the response doesn't match any of the values provided. Andernfalls wird eine 304-Antwort (nicht geändert) bereitgestellt.Otherwise, a 304 (Not Modified) response is served.
If-Modified-Since Wenn der If-None-Match Header nicht vorhanden ist, wird eine vollständige Antwort aus dem Cache bereitgestellt, wenn das zwischengespeicherte Antwort Datum neuer als der angegebene Wert ist.If the If-None-Match header isn't present, a full response is served from cache if the cached response date is newer than the value provided. Andernfalls wird eine 304-nicht geänderte Antwort verarbeitet.Otherwise, a 304 - Not Modified response is served.
Date Bei der Bereitstellung aus dem Cache Date wird der Header von der Middleware festgelegt, wenn er nicht in der ursprünglichen Antwort angegeben wurde.When serving from cache, the Date header is set by the middleware if it wasn't provided on the original response.
Content-Length Bei der Bereitstellung aus dem Cache Content-Length wird der Header von der Middleware festgelegt, wenn er nicht in der ursprünglichen Antwort angegeben wurde.When serving from cache, the Content-Length header is set by the middleware if it wasn't provided on the original response.
Age Der Age in der ursprünglichen Antwort gesendete Header wird ignoriert.The Age header sent in the original response is ignored. Die Middleware berechnet einen neuen Wert, wenn eine zwischengespeicherte Antwort bedient wird.The middleware computes a new value when serving a cached response.

Caching-Anweisungs Anforderungen Cache-Control-DirektivenCaching respects request Cache-Control directives

Die Middleware respektiert die Regeln der http 1,1-cachingspezifikation.The middleware respects the rules of the HTTP 1.1 Caching specification. Die Regeln erfordern einen Cache, um einen gültigen Header zu berücksichtigen, Cache-Control der vom Client gesendet wird.The rules require a cache to honor a valid Cache-Control header sent by the client. Unter der Spezifikation kann ein Client Anforderungen mit einem no-cache Header Wert senden und erzwingen, dass der Server eine neue Antwort für jede Anforderung generiert.Under the specification, a client can make requests with a no-cache header value and force the server to generate a new response for every request. Derzeit gibt es keine Entwickler Kontrolle über dieses zwischen Speicherungs Verhalten, wenn die Middleware verwendet wird, da die Middleware die offizielle zwischen Speicherungs Spezifikation befolgt.Currently, there's no developer control over this caching behavior when using the middleware because the middleware adheres to the official caching specification.

Weitere Informationen zum zwischen Speicherungs Verhalten finden Sie unter untersuchen anderer zwischen Speicherungs Funktionen von ASP.net Core.For more control over caching behavior, explore other caching features of ASP.NET Core. Weitere Informationen finden Sie in den folgenden Artikeln:See the following topics:

ProblembehandlungTroubleshooting

Wenn das Cachingverhalten nicht erwartungsgemäß ist, vergewissern Sie sich, dass die Antworten zwischengespeichert werden können und aus dem Cache bedient werden können.If caching behavior isn't as expected, confirm that responses are cacheable and capable of being served from the cache. Überprüfen der eingehenden Header der Anforderung und der ausgehenden Header der Antwort.Examine the request's incoming headers and the response's outgoing headers. Aktivieren der Protokollierung zum unterstützen des Debuggens.Enable logging to help with debugging.

Beim Testen und behandeln von Problemen zwischen Speicherungs Verhalten kann ein Browser Anforderungs Header festlegen, die das Caching auf unerwünschte Weise beeinflussen.When testing and troubleshooting caching behavior, a browser may set request headers that affect caching in undesirable ways. Ein Browser kann beispielsweise den- Cache-Control Header auf oder festlegen, no-cache max-age=0 Wenn eine Seite aktualisiert wird.For example, a browser may set the Cache-Control header to no-cache or max-age=0 when refreshing a page. Die folgenden Tools können Anforderungs Header explizit festlegen und werden für das Testen der Zwischenspeicherung bevorzugt:The following tools can explicitly set request headers and are preferred for testing caching:

Bedingungen für das ZwischenspeichernConditions for caching

  • Die Anforderung muss eine Serverantwort mit dem Statuscode 200 (OK) ergeben.The request must result in a server response with a 200 (OK) status code.
  • Die Anforderungs Methode muss "Get" oder "Head" lauten.The request method must be GET or HEAD.
  • In Startup.Configure muss die Zwischenspeicherung von Antwort Caching vor Middleware platziert werden, die Zwischenspeichern erfordert.In Startup.Configure, Response Caching Middleware must be placed before middleware that require caching. Weitere Informationen finden Sie unter ASP.NET Core-Middleware.For more information, see ASP.NET Core-Middleware.
  • Der Authorization Header darf nicht vorhanden sein.The Authorization header must not be present.
  • Cache-ControlHeader Parameter müssen gültig sein, und die Antwort muss markiert public und nicht gekennzeichnet sein private .Cache-Control header parameters must be valid, and the response must be marked public and not marked private.
  • Der Pragma: no-cache Header darf nicht vorhanden sein, wenn der Cache-Control Header nicht vorhanden ist, da der Header Cache-Control den Header überschreibt, Pragma Wenn er vorhanden ist.The Pragma: no-cache header must not be present if the Cache-Control header isn't present, as the Cache-Control header overrides the Pragma header when present.
  • Der Set-Cookie Header darf nicht vorhanden sein.The Set-Cookie header must not be present.
  • VaryHeader Parameter müssen gültig und nicht gleich sein * .Vary header parameters must be valid and not equal to *.
  • Der Content-Length Header Wert (falls festgelegt) muss mit der Größe des Antwort Texts identisch sein.The Content-Length header value (if set) must match the size of the response body.
  • IHttpSendFileFeatureWird nicht verwendet.The IHttpSendFileFeature isn't used.
  • Die Antwort darf nicht veraltet sein, wie von der- Expires Header-und der max-age -und- s-maxage Cache Direktive angegeben.The response must not be stale as specified by the Expires header and the max-age and s-maxage cache directives.
  • Die Antwort Pufferung muss erfolgreich sein.Response buffering must be successful. Die Größe der Antwort muss kleiner als der konfigurierte oder der Standardwert sein SizeLimit .The size of the response must be smaller than the configured or default SizeLimit. Die Textgröße der Antwort muss kleiner als der konfigurierte oder der Standardwert sein MaximumBodySize .The body size of the response must be smaller than the configured or default MaximumBodySize.
  • Die Antwort muss gemäß den Spezifikationen von RFC 7234 zwischengespeichert werden können.The response must be cacheable according to the RFC 7234 specifications. Beispielsweise darf die- no-store Direktive nicht in den Feldern der Anforderungs-oder Antwortheader vorhanden sein.For example, the no-store directive must not exist in request or response header fields. Weitere Informationen finden Sie in Abschnitt 3: Speichern von Antworten in Caches von RFC 7234 .See Section 3: Storing Responses in Caches of RFC 7234 for details.

Hinweis

Das antifälschungs System zum Erstellen von sicheren Token, um Angriffe durch Website übergreifende Anforderungs Fälschung (CSRF) zu verhindern, legt die Cache-Control -und- Pragma Header auf fest, no-cache sodass Antworten nicht zwischengespeichert werden.The Antiforgery system for generating secure tokens to prevent Cross-Site Request Forgery (CSRF) attacks sets the Cache-Control and Pragma headers to no-cache so that responses aren't cached. Informationen zum Deaktivieren von antifälschungstoken für HTML-Formularelemente finden Sie unter Verhindern von Angriffen für Website übergreifende Anforderungs Fälschung (XSRF/CSRF) in ASP.net Core .For information on how to disable antiforgery tokens for HTML form elements, see Verhindern von Angriffen für Website übergreifende Anforderungs Fälschung (XSRF/CSRF) in ASP.net Core.

Weitere RessourcenAdditional resources

In diesem Artikel wird erläutert, wie Sie die Zwischenspeicherung von Antwort Caching in einer ASP.net Core-App konfigurieren.This article explains how to configure Response Caching Middleware in an ASP.NET Core app. Die Middleware bestimmt, wann Antworten zwischengespeichert werden können, speichert Antworten und verarbeitet Antworten aus dem Cache.The middleware determines when responses are cacheable, stores responses, and serves responses from cache. Eine Einführung in das http-Caching und das-Attribut finden Sie unter zwischen [ResponseCache] Speichern von Antworten.For an introduction to HTTP caching and the [ResponseCache] attribute, see Response Caching.

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

KonfigurationConfiguration

Verwenden Sie das Metapaket "Microsoft. aspnetcore. app ", oder fügen Sie dem Paket " Microsoft. aspnetcore. responsecaching " einen Paket Verweis hinzu.Use the Microsoft.AspNetCore.App metapackage or add a package reference to the Microsoft.AspNetCore.ResponseCaching package.

Startup.ConfigureServicesFügen Sie in der Dienst Sammlung die Middleware zum Zwischenspeichern von Antworten hinzu:In Startup.ConfigureServices, add the Response Caching Middleware to the service collection:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCaching();
    services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Konfigurieren Sie die APP für die Verwendung der Middleware mit der- UseResponseCaching Erweiterungsmethode, mit der die Middleware der Pipeline für die Anforderungs Verarbeitung in hinzugefügt wird Startup.Configure :Configure the app to use the middleware with the UseResponseCaching extension method, which adds the middleware to the request processing pipeline in Startup.Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseResponseCaching();

    app.Use(async (context, next) =>
    {
        context.Response.GetTypedHeaders().CacheControl = 
            new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
            {
                Public = true,
                MaxAge = TimeSpan.FromSeconds(10)
            };
        context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = 
            new string[] { "Accept-Encoding" };

        await next();
    });

    app.UseMvc();
}

Die Beispiel-App Fügt Header zum Steuern der Zwischenspeicherung bei nachfolgenden Anforderungen hinzu:The sample app adds headers to control caching on subsequent requests:

  • Cache-Control: speichert zwischen speicherbare Antworten bis zu 10 Sekunden.Cache-Control: Caches cacheable responses for up to 10 seconds.
  • Vary: konfiguriert die Middleware so, dass Sie nur dann eine zwischengespeicherte Antwort bedient, wenn der Accept-Encoding- Header der nachfolgenden Anforderungen mit der ursprünglichen Anforderung übereinstimmt.Vary: Configures the middleware to serve a cached response only if the Accept-Encoding header of subsequent requests matches that of the original request.
// using Microsoft.AspNetCore.Http;

app.Use(async (context, next) =>
{
    context.Response.GetTypedHeaders().CacheControl = 
        new Microsoft.Net.Http.Headers.CacheControlHeaderValue()
        {
            Public = true,
            MaxAge = TimeSpan.FromSeconds(10)
        };
    context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = 
        new string[] { "Accept-Encoding" };

    await next();
});

Die vorangehenden Header werden nicht in die Antwort geschrieben und überschrieben, wenn ein Controller, eine Aktion oder eine Razor Seite:The preceding headers are not written to the response and are overridden when a controller, action, or Razor Page:

  • Verfügt über ein [Response Cache] -Attribut.Has a [ResponseCache] attribute. Dies gilt auch, wenn eine Eigenschaft nicht festgelegt ist.This applies even if a property isn't set. Wenn Sie z. b. die VaryByHeader -Eigenschaft weglassen, bewirkt dies, dass der entsprechende Header aus der Antwort entfernt wird.For example, omitting the VaryByHeader property will cause the corresponding header to be removed from the response.

Die Middleware zum Zwischenspeichern von Antworten speichert nur Server Antworten zwischen, die zu einem 200 (OK)-Statuscode führen.Response Caching Middleware only caches server responses that result in a 200 (OK) status code. Alle anderen Antworten, einschließlich der Fehlerseiten, werden von der Middleware ignoriert.Any other responses, including error pages, are ignored by the middleware.

Warnung

Antworten, die Inhalte für authentifizierte Clients enthalten, müssen als nicht zwischen speicherbar gekennzeichnet werden, um zu verhindern, dass die Middleware diese Antworten speichert und bedient.Responses containing content for authenticated clients must be marked as not cacheable to prevent the middleware from storing and serving those responses. Ausführliche Informationen dazu, wie die Middleware festlegt, ob eine Antwort zwischengespeichert werden kann, finden Sie unter Bedingungen für das Caching .See Conditions for caching for details on how the middleware determines if a response is cacheable.

OptionenOptions

Die Optionen zum Zwischenspeichern von Antworten sind in der folgenden Tabelle aufgeführt.Response caching options are shown in the following table.

OptionOption BESCHREIBUNGDescription
MaximumBodySize Die größte zwischen speicherbare Größe für den Antworttext in Bytes.The largest cacheable size for the response body in bytes. Der Standardwert ist 64 * 1024 * 1024 (64 MB).The default value is 64 * 1024 * 1024 (64 MB).
SizeLimit Die Größenbeschränkung für die Antwort Cache-Middleware in Bytes.The size limit for the response cache middleware in bytes. Der Standardwert ist 100 * 1024 * 1024 (100 MB).The default value is 100 * 1024 * 1024 (100 MB).
UseCaseSensitivePaths Bestimmt, ob Antworten bei Pfaden zwischen Groß-und Kleinschreibung zwischengespeichert werden.Determines if responses are cached on case-sensitive paths. Der Standardwert ist false.The default value is false.

Im folgenden Beispiel wird die Middleware wie folgt konfiguriert:The following example configures the middleware to:

  • Zwischenspeichern von Antworten mit einer Textgröße, die kleiner oder gleich 1.024 Bytes ist.Cache responses with a body size smaller than or equal to 1,024 bytes.
  • Speichert die Antworten nach Pfaden mit Unterscheidung nach Groß-/KleinschreibungStore the responses by case-sensitive paths. Beispielsweise /page1 werden und /Page1 separat gespeichert.For example, /page1 and /Page1 are stored separately.
services.AddResponseCaching(options =>
{
    options.MaximumBodySize = 1024;
    options.UseCaseSensitivePaths = true;
});

VarybyquerykeysVaryByQueryKeys

Bei Verwendung von MVC/Web-API-Controllern oder Razor Seiten Modellen gibt das- [ResponseCache] Attribut die Parameter an, die zum Festlegen der entsprechenden Header für das Zwischenspeichern von Antworten erforderlich sind.When using MVC / web API controllers or Razor Pages page models, the [ResponseCache] attribute specifies the parameters necessary for setting the appropriate headers for response caching. Der einzige Parameter des [ResponseCache] Attributs, der die Middleware strikt erfordert VaryByQueryKeys , ist, was keinem tatsächlichen HTTP-Header entspricht.The only parameter of the [ResponseCache] attribute that strictly requires the middleware is VaryByQueryKeys, which doesn't correspond to an actual HTTP header. Weitere Informationen finden Sie unter Zwischenspeichern von Antworten in ASP.net Core.For more information, see Zwischenspeichern von Antworten in ASP.net Core.

Wenn das-Attribut nicht verwendet wird [ResponseCache] , kann das Zwischenspeichern von Antworten mit variiert werden VaryByQueryKeys .When not using the [ResponseCache] attribute, response caching can be varied with VaryByQueryKeys. Verwenden Sie das ResponseCachingFeature direkt aus HttpContext. Features:Use the ResponseCachingFeature directly from the HttpContext.Features:

var responseCachingFeature = context.HttpContext.Features.Get<IResponseCachingFeature>();

if (responseCachingFeature != null)
{
    responseCachingFeature.VaryByQueryKeys = new[] { "MyKey" };
}

Durch die Verwendung eines einzelnen Werts * VaryByQueryKeys von in variiert der Cache von allen Anforderungs Abfrage Parametern.Using a single value equal to * in VaryByQueryKeys varies the cache by all request query parameters.

HTTP-Header, die von der zwischenware zum ZwischenspeichernHTTP headers used by Response Caching Middleware

Die folgende Tabelle enthält Informationen über HTTP-Header, die sich auf das Zwischenspeichern von Antworten auswirkenThe following table provides information on HTTP headers that affect response caching.

HeaderHeader DetailsDetails
Authorization Die Antwort wird nicht zwischengespeichert, wenn der Header vorhanden ist.The response isn't cached if the header exists.
Cache-Control Die Middleware berücksichtigt nur zwischen Speicherungs Antworten, die mit der public Cache Direktive gekennzeichnet sind.The middleware only considers caching responses marked with the public cache directive. Steuern Sie die Zwischenspeicherung mit den folgenden Parametern:Control caching with the following parameters:
  • Max-agemax-age
  • Max-veralteter†max-stale†
  • min-Freshmin-fresh
  • must-revalidatemust-revalidate
  • Kein Cacheno-cache
  • No-Storeno-store
  • nur-if-Cacheonly-if-cached
  • Privatprivate
  • öffentlichpublic
  • s-maxages-maxage
  • proxy-revalidate‡proxy-revalidate‡
†wenn kein Limit für angegeben ist max-stale , führt die Middleware keine Aktion aus.†If no limit is specified to max-stale, the middleware takes no action.
proxy-revalidate hat dieselbe Wirkung wie must-revalidate .proxy-revalidate has the same effect as must-revalidate.

Weitere Informationen finden Sie unter RFC 7231: Anfordern von Cache-Control-Direktiven.For more information, see RFC 7231: Request Cache-Control Directives.
Pragma Ein- Pragma: no-cache Header in der Anforderung erzeugt denselben Effekt wie Cache-Control: no-cache .A Pragma: no-cache header in the request produces the same effect as Cache-Control: no-cache. Dieser Header wird durch die relevanten Direktiven im Header überschrieben Cache-Control , sofern vorhanden.This header is overridden by the relevant directives in the Cache-Control header, if present. Wird aus Gründen der Abwärtskompatibilität mit HTTP/1.0 berücksichtigt.Considered for backward compatibility with HTTP/1.0.
Set-Cookie Die Antwort wird nicht zwischengespeichert, wenn der Header vorhanden ist.The response isn't cached if the header exists. Jede Middleware in der Anforderungs Verarbeitungs Pipeline, mit der ein oder mehrere s festgelegt werden, verhindert, dass cookie die Antwort zwischen speichernde Middleware die Antwort zwischenspeichert (z. b. dem cookie -basierten TempData-Anbieter).Any middleware in the request processing pipeline that sets one or more cookies prevents the Response Caching Middleware from caching the response (for example, the cookie-based TempData provider).
Vary Der- Vary Header wird verwendet, um die zwischengespeicherte Antwort von einem anderen Header zu verändern.The Vary header is used to vary the cached response by another header. Beispielsweise können Sie Antworten durch die Codierung Zwischenspeichern, indem Sie den Vary: Accept-Encoding -Header einschließen, der Antworten für Anforderungen mit Headern Accept-Encoding: gzip und separat zwischenspeichert Accept-Encoding: text/plain .For example, cache responses by encoding by including the Vary: Accept-Encoding header, which caches responses for requests with headers Accept-Encoding: gzip and Accept-Encoding: text/plain separately. Eine Antwort mit dem-Header Wert * wird nie gespeichert.A response with a header value of * is never stored.
Expires Eine Antwort, die von diesem Header als veraltet eingestuft wird, wird nur dann gespeichert oder abgerufen, wenn Sie von anderen Cache-Control HeadernA response deemed stale by this header isn't stored or retrieved unless overridden by other Cache-Control headers.
If-None-Match Die vollständige Antwort wird aus dem Cache bereitgestellt, wenn der Wert nicht ist, * und die ETag der Antwort entspricht keinem der angegebenen Werte.The full response is served from cache if the value isn't * and the ETag of the response doesn't match any of the values provided. Andernfalls wird eine 304-Antwort (nicht geändert) bereitgestellt.Otherwise, a 304 (Not Modified) response is served.
If-Modified-Since Wenn der If-None-Match Header nicht vorhanden ist, wird eine vollständige Antwort aus dem Cache bereitgestellt, wenn das zwischengespeicherte Antwort Datum neuer als der angegebene Wert ist.If the If-None-Match header isn't present, a full response is served from cache if the cached response date is newer than the value provided. Andernfalls wird eine 304-nicht geänderte Antwort verarbeitet.Otherwise, a 304 - Not Modified response is served.
Date Bei der Bereitstellung aus dem Cache Date wird der Header von der Middleware festgelegt, wenn er nicht in der ursprünglichen Antwort angegeben wurde.When serving from cache, the Date header is set by the middleware if it wasn't provided on the original response.
Content-Length Bei der Bereitstellung aus dem Cache Content-Length wird der Header von der Middleware festgelegt, wenn er nicht in der ursprünglichen Antwort angegeben wurde.When serving from cache, the Content-Length header is set by the middleware if it wasn't provided on the original response.
Age Der Age in der ursprünglichen Antwort gesendete Header wird ignoriert.The Age header sent in the original response is ignored. Die Middleware berechnet einen neuen Wert, wenn eine zwischengespeicherte Antwort bedient wird.The middleware computes a new value when serving a cached response.

Caching-Anweisungs Anforderungen Cache-Control-DirektivenCaching respects request Cache-Control directives

Die Middleware respektiert die Regeln der http 1,1-cachingspezifikation.The middleware respects the rules of the HTTP 1.1 Caching specification. Die Regeln erfordern einen Cache, um einen gültigen Header zu berücksichtigen, Cache-Control der vom Client gesendet wird.The rules require a cache to honor a valid Cache-Control header sent by the client. Unter der Spezifikation kann ein Client Anforderungen mit einem no-cache Header Wert senden und erzwingen, dass der Server eine neue Antwort für jede Anforderung generiert.Under the specification, a client can make requests with a no-cache header value and force the server to generate a new response for every request. Derzeit gibt es keine Entwickler Kontrolle über dieses zwischen Speicherungs Verhalten, wenn die Middleware verwendet wird, da die Middleware die offizielle zwischen Speicherungs Spezifikation befolgt.Currently, there's no developer control over this caching behavior when using the middleware because the middleware adheres to the official caching specification.

Weitere Informationen zum zwischen Speicherungs Verhalten finden Sie unter untersuchen anderer zwischen Speicherungs Funktionen von ASP.net Core.For more control over caching behavior, explore other caching features of ASP.NET Core. Weitere Informationen finden Sie in den folgenden Artikeln:See the following topics:

ProblembehandlungTroubleshooting

Wenn das Cachingverhalten nicht erwartungsgemäß ist, vergewissern Sie sich, dass die Antworten zwischengespeichert werden können und aus dem Cache bedient werden können.If caching behavior isn't as expected, confirm that responses are cacheable and capable of being served from the cache. Überprüfen der eingehenden Header der Anforderung und der ausgehenden Header der Antwort.Examine the request's incoming headers and the response's outgoing headers. Aktivieren der Protokollierung zum unterstützen des Debuggens.Enable logging to help with debugging.

Beim Testen und behandeln von Problemen zwischen Speicherungs Verhalten kann ein Browser Anforderungs Header festlegen, die das Caching auf unerwünschte Weise beeinflussen.When testing and troubleshooting caching behavior, a browser may set request headers that affect caching in undesirable ways. Ein Browser kann beispielsweise den- Cache-Control Header auf oder festlegen, no-cache max-age=0 Wenn eine Seite aktualisiert wird.For example, a browser may set the Cache-Control header to no-cache or max-age=0 when refreshing a page. Die folgenden Tools können Anforderungs Header explizit festlegen und werden für das Testen der Zwischenspeicherung bevorzugt:The following tools can explicitly set request headers and are preferred for testing caching:

Bedingungen für das ZwischenspeichernConditions for caching

  • Die Anforderung muss eine Serverantwort mit dem Statuscode 200 (OK) ergeben.The request must result in a server response with a 200 (OK) status code.
  • Die Anforderungs Methode muss "Get" oder "Head" lauten.The request method must be GET or HEAD.
  • In Startup.Configure muss die Zwischenspeicherung von Antwort Caching vor Middleware platziert werden, die Zwischenspeichern erfordert.In Startup.Configure, Response Caching Middleware must be placed before middleware that require caching. Weitere Informationen finden Sie unter ASP.NET Core-Middleware.For more information, see ASP.NET Core-Middleware.
  • Der Authorization Header darf nicht vorhanden sein.The Authorization header must not be present.
  • Cache-ControlHeader Parameter müssen gültig sein, und die Antwort muss markiert public und nicht gekennzeichnet sein private .Cache-Control header parameters must be valid, and the response must be marked public and not marked private.
  • Der Pragma: no-cache Header darf nicht vorhanden sein, wenn der Cache-Control Header nicht vorhanden ist, da der Header Cache-Control den Header überschreibt, Pragma Wenn er vorhanden ist.The Pragma: no-cache header must not be present if the Cache-Control header isn't present, as the Cache-Control header overrides the Pragma header when present.
  • Der Set-Cookie Header darf nicht vorhanden sein.The Set-Cookie header must not be present.
  • VaryHeader Parameter müssen gültig und nicht gleich sein * .Vary header parameters must be valid and not equal to *.
  • Der Content-Length Header Wert (falls festgelegt) muss mit der Größe des Antwort Texts identisch sein.The Content-Length header value (if set) must match the size of the response body.
  • IHttpSendFileFeatureWird nicht verwendet.The IHttpSendFileFeature isn't used.
  • Die Antwort darf nicht veraltet sein, wie von der- Expires Header-und der max-age -und- s-maxage Cache Direktive angegeben.The response must not be stale as specified by the Expires header and the max-age and s-maxage cache directives.
  • Die Antwort Pufferung muss erfolgreich sein.Response buffering must be successful. Die Größe der Antwort muss kleiner als der konfigurierte oder der Standardwert sein SizeLimit .The size of the response must be smaller than the configured or default SizeLimit. Die Textgröße der Antwort muss kleiner als der konfigurierte oder der Standardwert sein MaximumBodySize .The body size of the response must be smaller than the configured or default MaximumBodySize.
  • Die Antwort muss gemäß den Spezifikationen von RFC 7234 zwischengespeichert werden können.The response must be cacheable according to the RFC 7234 specifications. Beispielsweise darf die- no-store Direktive nicht in den Feldern der Anforderungs-oder Antwortheader vorhanden sein.For example, the no-store directive must not exist in request or response header fields. Weitere Informationen finden Sie in Abschnitt 3: Speichern von Antworten in Caches von RFC 7234 .See Section 3: Storing Responses in Caches of RFC 7234 for details.

Hinweis

Das antifälschungs System zum Erstellen von sicheren Token, um Angriffe durch Website übergreifende Anforderungs Fälschung (CSRF) zu verhindern, legt die Cache-Control -und- Pragma Header auf fest, no-cache sodass Antworten nicht zwischengespeichert werden.The Antiforgery system for generating secure tokens to prevent Cross-Site Request Forgery (CSRF) attacks sets the Cache-Control and Pragma headers to no-cache so that responses aren't cached. Informationen zum Deaktivieren von antifälschungstoken für HTML-Formularelemente finden Sie unter Verhindern von Angriffen für Website übergreifende Anforderungs Fälschung (XSRF/CSRF) in ASP.net Core .For information on how to disable antiforgery tokens for HTML form elements, see Verhindern von Angriffen für Website übergreifende Anforderungs Fälschung (XSRF/CSRF) in ASP.net Core.

Zusätzliche RessourcenAdditional resources