Middleware di Caching delle Risposte in ASP.NET Core

Di John Luo e Rick Anderson

Questo articolo illustra come configurare il middleware di memorizzazione nella cache delle risposte in un'app core ASP.NET. Il middleware determina quando le risposte sono memorizzabili nella cache, archivia le risposte e le serve dalla cache. Per un'introduzione alla memorizzazione nella cache HTTP e all'attributo [ResponseCache] , vedere Memorizzazione nella cache delle risposte.

Il middleware di memorizzazione nella cache della risposta consente la memorizzazione nella cache delle risposte del server in base alle intestazioni HTTP Cache-Control.

  • Il comportamento di memorizzazione nella cache implementa la semantica di memorizzazione nella cache HTTP standard.

  • La memorizzazione nella cache si basa su intestazioni della cache HTTP simili al metodo usato dai proxy.

  • Questa forma di memorizzazione nella cache è utile per le richieste API GET o HEAD pubbliche dai client in cui vengono soddisfatte le condizioni per la memorizzazione nella cache .

  • Per le app dell'interfaccia utente come Razor Pages, la memorizzazione nella cache delle risposte non è in genere utile. I browser impostano comunemente le intestazioni di richiesta che impediscono la memorizzazione nella cache.

    Output caching (disponibile in .NET 7 e versioni successive) è un approccio migliore per le app dell'interfaccia utente. In questo scenario, la configurazione determina cosa memorizzare nella cache indipendentemente dalle intestazioni HTTP.

Per testare la memorizzazione nella cache delle risposte, usare Fiddler o un altro strumento in grado di impostare in modo esplicito le intestazioni della richiesta. L'impostazione esplicita delle intestazioni è preferibile per il test della memorizzazione nella cache. Per altre informazioni, vedere Risoluzione dei problemi relativi al middleware > di memorizzazione nella cache delle risposte.

Configuration

In Program.cs aggiungere i servizi di middleware per la cache delle risposte alla raccolta di servizi AddResponseCaching e configurare l'app per utilizzare il middleware con il metodo di estensione UseResponseCaching. UseResponseCaching aggiunge il middleware alla pipeline di elaborazione delle richieste:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCaching();

var app = builder.Build();

app.UseHttpsRedirection();

// UseCors must be called before UseResponseCaching
//app.UseCors();

app.UseResponseCaching();

Warning

UseCors deve essere chiamato prima di UseResponseCaching quando si usa il middleware CORS.

L'app di esempio aggiunge intestazioni HTTP per controllare la memorizzazione nella cache delle richieste successive.

  • Cache-Control: memorizza nella cache le risposte memorizzabili nella cache per un massimo di 10 secondi.
  • Variare: configura il middleware per gestire una risposta memorizzata nella cache solo se l'intestazione Accept-Encoding delle richieste successive corrisponde a quella della richiesta originale.
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCaching();

var app = builder.Build();

app.UseHttpsRedirection();

// UseCors must be called before UseResponseCaching
//app.UseCors();

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.MapGet("/", () => DateTime.Now.Millisecond);

app.Run();

Le intestazioni precedenti non vengono scritte nella risposta e vengono sottoposte a override quando un controller, un'azione o Razor una pagina:

Il middleware di memorizzazione nella cache della risposta memorizza nella cache solo le risposte del server che generano un codice di stato 200 (OK). Tutte le altre risposte, incluse le pagine di errore, vengono ignorate dal middleware.

Warning

Le risposte contenenti contenuto per i client autenticati devono essere contrassegnate come non memorizzabili nella cache per impedire al middleware di archiviare e gestire tali risposte. Per informazioni dettagliate su come il middleware determina se una risposta è memorizzabile nella cache, vedere Condizioni per la memorizzazione nella cache .

Il codice precedente in genere non restituisce un valore memorizzato nella cache in un browser. Usare Fiddler o un altro strumento in grado di impostare in modo esplicito le intestazioni delle richieste ed è preferibile per il test della memorizzazione nella cache. Per altre informazioni, vedere Risoluzione dei problemi in questo articolo.

Options

Le opzioni di memorizzazione nella cache delle risposte sono illustrate nella tabella seguente.

Option Description
MaximumBodySize Dimensione memorizzabile nella cache massima per il corpo della risposta in byte. Il valore predefinito è 64 * 1024 * 1024 (64 MB).
SizeLimit Limite di dimensioni per il middleware della cache delle risposte in byte. Il valore predefinito è 100 * 1024 * 1024 (100 MB).
UseCaseSensitivePaths Determina se le risposte vengono memorizzate nella cache nei percorsi con distinzione tra maiuscole e minuscole. Il valore predefinito è false.

L'esempio seguente configura il middleware per:

  • Memorizzare nella cache le risposte con dimensione del contenuto inferiore o uguale a 1.024 byte.
  • Archiviare le risposte in base ai percorsi con distinzione tra maiuscole e minuscole. Ad esempio, /page1 e /Page1 vengono archiviati separatamente.
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddResponseCaching(options =>
{
    options.MaximumBodySize = 1024;
    options.UseCaseSensitivePaths = true;
});

var app = builder.Build();

app.UseHttpsRedirection();

// UseCors must be called before UseResponseCaching
//app.UseCors();

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(context);
});

app.MapGet("/", () => DateTime.Now.Millisecond);

app.Run();

VaryByQueryKeys

Quando si usano modelli di pagina MVC, controller API Web o Razor Pagine, l'attributo [ResponseCache] specifica i parametri necessari per impostare le intestazioni appropriate per la memorizzazione nella cache delle risposte. L'unico parametro dell'attributo [ResponseCache] che richiede rigorosamente il middleware è VaryByQueryKeys, che non corrisponde a un'intestazione HTTP effettiva. Per altre informazioni, vedere Memorizzazione nella cache delle risposte in ASP.NET Core.

Se non si utilizza l'attributo [ResponseCache], la memorizzazione nella cache delle risposte può essere variata con VaryByQueryKeys. Utilizza il ResponseCachingFeature direttamente da HttpContext.Features:

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

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

L'uso di un singolo valore uguale a * in VaryByQueryKeys varia la cache in base a tutti i parametri di query della richiesta.

Intestazioni HTTP utilizzate dal middleware di cache delle risposte

Nella tabella seguente vengono fornite informazioni sulle intestazioni HTTP che influiscono sulla memorizzazione nella cache delle risposte.

Header Details
Authorization La risposta non viene memorizzata nella cache se l'intestazione esiste.
Cache-Control Il middleware considera solo le risposte di memorizzazione nella cache contrassegnate con la direttiva cache public . Controllare la memorizzazione nella cache con i parametri seguenti:
  • max-age
  • max-stale†
  • min-fresh
  • must-revalidate
  • no-cache
  • no-store
  • only-if-cached
  • private
  • public
  • s-maxage
  • proxy-revalidate‡
†Se non viene specificato alcun limite a max-stale, il middleware non esegue alcuna azione.
*proxy-revalidate ha lo stesso effetto di must-revalidate.

Per altre informazioni, vedere RFC 9111: Direttive di richiesta.
Pragma Un'intestazione Pragma: no-cache nella richiesta produce lo stesso effetto di Cache-Control: no-cache. Questa intestazione viene sostituita dalle direttive pertinenti nell'intestazione Cache-Control, se presente. Considerato per la retrocompatibilità con HTTP/1.0.
Set-Cookie La risposta non viene memorizzata nella cache se l'intestazione esiste. Qualsiasi middleware nella pipeline di elaborazione delle richieste che imposta uno o più cookie impedisce al middleware per la memorizzazione nella cache delle risposte di archiviare la risposta, come ad esempio il provider TempData basato su .
Vary L'intestazione Vary viene usata per variare la risposta memorizzata nella cache in base a un'altra intestazione. Ad esempio, memorizzare nella cache le risposte in base alla codifica includendo l'intestazione Vary: Accept-Encoding , che memorizza nella cache le risposte per le richieste con intestazioni Accept-Encoding: gzip e Accept-Encoding: text/plain separatamente. Una risposta con un valore di intestazione di * non viene mai archiviata.
Expires Una risposta considerata non aggiornata da questa intestazione non viene archiviata o recuperata a meno che non venga ignorata da altre Cache-Control intestazioni.
If-None-Match La risposta completa viene servita dalla cache se il valore non è * e se l'ETag della risposta non corrisponde ad alcuno dei valori specificati. In caso contrario, viene fornita una risposta 304 (non modificata).
If-Modified-Since Se l'intestazione If-None-Match non è presente, viene fornita una risposta completa dalla cache se la data di risposta memorizzata nella cache è più recente del valore specificato. In caso contrario, viene servita una risposta 304 - Non modificata .
Date Quando si gestisce dalla cache, l'intestazione Date viene impostata dal middleware se non è stata specificata nella risposta originale.
Content-Length Quando si gestisce dalla cache, l'intestazione Content-Length viene impostata dal middleware se non è stata specificata nella risposta originale.
Age L'intestazione Age inviata nella risposta originale viene ignorata. Il middleware calcola un nuovo valore quando si gestisce una risposta memorizzata nella cache.

La memorizzazione nella cache rispetta le direttive cache-control della richiesta

Il middleware rispetta le regole di RFC 9111: memorizzazione nella cache HTTP (sezione 5.2). Cache-Control). Le regole richiedono una cache per rispettare un'intestazione valida Cache-Control inviata dal client. In base alla specifica, un client può effettuare richieste con un no-cache valore di intestazione e forzare il server a generare una nuova risposta per ogni richiesta. Attualmente, non esiste alcun controllo dello sviluppatore su questo comportamento di memorizzazione nella cache quando si usa il middleware perché il middleware è conforme alla specifica ufficiale di memorizzazione nella cache.

Per un maggiore controllo sul comportamento di memorizzazione nella cache, esplorare altre funzionalità di memorizzazione nella cache di ASP.NET Core. Vedi gli argomenti seguenti:

Troubleshooting

Il middleware di memorizzazione nella cache delle risposte usa IMemoryCache, che ha una capacità limitata. Quando viene superata la capacità, la cache di memoria viene compattata (TriggerOvercapacityCompaction).

Note

In genere, i collegamenti della documentazione alla sorgente di riferimento .NET caricano il ramo predefinito del repository, che rappresenta lo sviluppo corrente per la versione successiva di .NET. Per selezionare un tag per una versione specifica, utilizzare il menu a tendina Seleziona rami o tag. Per ulteriori informazioni, vedere Come selezionare un tag di versione del codice sorgente di ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Se il comportamento di memorizzazione nella cache non è quello previsto, verificare che le risposte siano memorizzabili nella cache e in grado di essere gestite dalla cache. Esaminare le intestazioni in ingresso della richiesta e le intestazioni in uscita della risposta. Abilitare la registrazione per facilitare il debug.

Durante il test e la risoluzione dei problemi relativi al comportamento di memorizzazione nella cache, un browser imposta in genere le intestazioni di richiesta che impediscono la memorizzazione nella cache. Ad esempio, un browser può impostare l'intestazione Cache-Control su no-cache o max-age=0 quando si aggiorna una pagina. Fiddler e altri strumenti possono impostare in modo esplicito le intestazioni delle richieste e sono preferiti per il test della memorizzazione nella cache.

Condizioni per la memorizzazione nella cache

  • La richiesta deve generare una risposta del server con un codice di stato 200 (OK).
  • Il metodo della richiesta deve essere GET o HEAD.
  • Il middleware di memorizzazione nella cache della risposta deve essere inserito prima del middleware che richiede la memorizzazione nella cache. Per altre informazioni, vedere Middleware ASP.NET Core.
  • L'intestazione Authorization non deve essere presente.
  • Cache-ControlI parametri di intestazione devono essere validi e la risposta deve essere contrassegnata public e non contrassegnata private.
  • L'intestazione Pragma: no-cache non deve essere presente se l'intestazione Cache-Control non è presente, perché l'intestazione esegue l'override Cache-Control dell'intestazione Pragma quando presente.
  • L'intestazione Set-Cookie non deve essere presente.
  • Vary I parametri di intestazione devono essere validi e non uguali a *.
  • Il Content-Length valore dell'intestazione (se impostato) deve corrispondere alle dimensioni del corpo della risposta.
  • L'oggetto IHttpSendFileFeature non viene usato.
  • La risposta non deve essere obsoleta come specificato dall'intestazione Expires e dalle max-age direttive della cache e s-maxage .
  • La bufferizzazione della risposta deve riuscire. Le dimensioni della risposta devono essere inferiori a quelle configurate o predefinite SizeLimit. Le dimensioni del corpo della risposta devono essere inferiori a quelle configurate o predefinite MaximumBodySize.
  • La risposta deve essere memorizzata nella cache in base a RFC 9111: memorizzazione nella cache HTTP. Ad esempio, la no-store direttiva non deve esistere nei campi di intestazione della richiesta o della risposta. Per informazioni dettagliate, vedere RFC 9111: Memorizzazione nella cache HTTP (sezione 3: Archiviazione di risposte nelle cache ).

Note

Il sistema Antiforgery per generare token sicuri per prevenire attacchi CSRF (Cross-Site Request Forgery) imposta le intestazioni Cache-Control e Pragma a no-cache affinché le risposte non siano memorizzate nella cache. Per informazioni su come disabilitare i token antiforgery per gli elementi del modulo HTML, vedere Impedire attacchi XSRF/CSRF (Cross-Site Request Forgery) in ASP.NET Core.

Risorse aggiuntive

Questo articolo spiega come configurare il middleware di caching delle risposte in un'app ASP.NET Core. Il middleware determina quando le risposte sono memorizzabili nella cache, archivia le risposte e le serve dalla cache. Per un'introduzione alla memorizzazione nella cache HTTP e all'attributo [ResponseCache] , vedere Memorizzazione nella cache delle risposte.

Visualizzare o scaricare il codice di esempio (procedura per il download)

Configuration

Il middleware di memorizzazione nella cache delle risposte è disponibile in modo implicito per ASP.NET app Core tramite il framework condiviso.

In Startup.ConfigureServicesaggiungere il middleware di memorizzazione nella cache delle risposte alla raccolta di servizi:

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

Configurare l'app per utilizzare il middleware con il metodo di estensione UseResponseCaching, che aggiunge il middleware alla pipeline di elaborazione delle richieste 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();
    });
}

Warning

UseCors deve essere chiamato prima di UseResponseCaching quando si usa il middleware CORS.

L'app di esempio aggiunge intestazioni HTTP per controllare la memorizzazione nella cache delle richieste successive.

  • Cache-Control: memorizza nella cache le risposte memorizzabili nella cache per un massimo di 10 secondi.
  • Variare: configura il middleware per gestire una risposta memorizzata nella cache solo se l'intestazione Accept-Encoding delle richieste successive corrisponde a quella della richiesta originale.
// 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();
});

Le intestazioni precedenti non vengono scritte nella risposta e vengono sottoposte a override quando un controller, un'azione o Razor una pagina:

Il middleware di memorizzazione nella cache della risposta memorizza nella cache solo le risposte del server che generano un codice di stato 200 (OK). Tutte le altre risposte, incluse le pagine di errore, vengono ignorate dal middleware.

Warning

Le risposte contenenti contenuto per i client autenticati devono essere contrassegnate come non memorizzabili nella cache per impedire al middleware di archiviare e gestire tali risposte. Per informazioni dettagliate su come il middleware determina se una risposta è memorizzabile nella cache, vedere Condizioni per la memorizzazione nella cache .

Options

Le opzioni di memorizzazione nella cache delle risposte sono illustrate nella tabella seguente.

Option Description
MaximumBodySize Dimensione memorizzabile nella cache massima per il corpo della risposta in byte. Il valore predefinito è 64 * 1024 * 1024 (64 MB).
SizeLimit Limite di dimensioni per il middleware della cache delle risposte in byte. Il valore predefinito è 100 * 1024 * 1024 (100 MB).
UseCaseSensitivePaths Determina se le risposte vengono memorizzate nella cache nei percorsi con distinzione tra maiuscole e minuscole. Il valore predefinito è false.

L'esempio seguente configura il middleware per:

  • Memorizzare nella cache le risposte con dimensione del contenuto inferiore o uguale a 1.024 byte.
  • Archiviare le risposte in base ai percorsi con distinzione tra maiuscole e minuscole. Ad esempio, /page1 e /Page1 vengono archiviati separatamente.
services.AddResponseCaching(options =>
{
    options.MaximumBodySize = 1024;
    options.UseCaseSensitivePaths = true;
});

VaryByQueryKeys

Quando si usano controller API MVC/Web o Razor modelli di pagina Pagine, l'attributo [ResponseCache] specifica i parametri necessari per impostare le intestazioni appropriate per la memorizzazione nella cache delle risposte. L'unico parametro dell'attributo [ResponseCache] che richiede rigorosamente il middleware è VaryByQueryKeys, che non corrisponde a un'intestazione HTTP effettiva. Per altre informazioni, vedere Memorizzazione nella cache delle risposte in ASP.NET Core.

Se non si utilizza l'attributo [ResponseCache], la memorizzazione nella cache delle risposte può essere variata con VaryByQueryKeys. Utilizza il ResponseCachingFeature direttamente da HttpContext.Features:

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

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

L'uso di un singolo valore uguale a * in VaryByQueryKeys varia la cache in base a tutti i parametri di query della richiesta.

Intestazioni HTTP utilizzate dal middleware di cache delle risposte

Nella tabella seguente vengono fornite informazioni sulle intestazioni HTTP che influiscono sulla memorizzazione nella cache delle risposte.

Header Details
Authorization La risposta non viene memorizzata nella cache se l'intestazione esiste.
Cache-Control Il middleware considera solo le risposte di memorizzazione nella cache contrassegnate con la direttiva cache public . Controllare la memorizzazione nella cache con i parametri seguenti:
  • max-age
  • max-stale†
  • min-fresh
  • must-revalidate
  • no-cache
  • no-store
  • only-if-cached
  • private
  • public
  • s-maxage
  • proxy-revalidate‡
†Se non viene specificato alcun limite a max-stale, il middleware non esegue alcuna azione.
*proxy-revalidate ha lo stesso effetto di must-revalidate.

Per altre informazioni, vedere RFC 9111: Direttive di richiesta.
Pragma Un'intestazione Pragma: no-cache nella richiesta produce lo stesso effetto di Cache-Control: no-cache. Questa intestazione viene sostituita dalle direttive pertinenti nell'intestazione Cache-Control, se presente. Considerato per la retrocompatibilità con HTTP/1.0.
Set-Cookie La risposta non viene memorizzata nella cache se l'intestazione esiste. Qualsiasi middleware nella pipeline di elaborazione delle richieste che imposta uno o più cookie impedisce al middleware per la memorizzazione nella cache delle risposte di archiviare la risposta, come ad esempio il provider TempData basato su .
Vary L'intestazione Vary viene usata per variare la risposta memorizzata nella cache in base a un'altra intestazione. Ad esempio, memorizzare nella cache le risposte in base alla codifica includendo l'intestazione Vary: Accept-Encoding , che memorizza nella cache le risposte per le richieste con intestazioni Accept-Encoding: gzip e Accept-Encoding: text/plain separatamente. Una risposta con un valore di intestazione di * non viene mai archiviata.
Expires Una risposta considerata non aggiornata da questa intestazione non viene archiviata o recuperata a meno che non venga ignorata da altre Cache-Control intestazioni.
If-None-Match La risposta completa viene servita dalla cache se il valore non è * e se l'ETag della risposta non corrisponde ad alcuno dei valori specificati. In caso contrario, viene fornita una risposta 304 (non modificata).
If-Modified-Since Se l'intestazione If-None-Match non è presente, viene fornita una risposta completa dalla cache se la data di risposta memorizzata nella cache è più recente del valore specificato. In caso contrario, viene servita una risposta 304 - Non modificata .
Date Quando si gestisce dalla cache, l'intestazione Date viene impostata dal middleware se non è stata specificata nella risposta originale.
Content-Length Quando si gestisce dalla cache, l'intestazione Content-Length viene impostata dal middleware se non è stata specificata nella risposta originale.
Age L'intestazione Age inviata nella risposta originale viene ignorata. Il middleware calcola un nuovo valore quando si gestisce una risposta memorizzata nella cache.

La memorizzazione nella cache rispetta le direttive cache-control della richiesta

Il middleware rispetta le regole di RFC 9111: memorizzazione nella cache HTTP (sezione 5.2). Cache-Control). Le regole richiedono una cache per rispettare un'intestazione valida Cache-Control inviata dal client. In base alla specifica, un client può effettuare richieste con un no-cache valore di intestazione e forzare il server a generare una nuova risposta per ogni richiesta. Attualmente, non esiste alcun controllo dello sviluppatore su questo comportamento di memorizzazione nella cache quando si usa il middleware perché il middleware è conforme alla specifica ufficiale di memorizzazione nella cache.

Per un maggiore controllo sul comportamento di memorizzazione nella cache, esplorare altre funzionalità di memorizzazione nella cache di ASP.NET Core. Vedi gli argomenti seguenti:

Troubleshooting

Se il comportamento di memorizzazione nella cache non è quello previsto, verificare che le risposte siano memorizzabili nella cache e in grado di essere gestite dalla cache. Esaminare le intestazioni in ingresso della richiesta e le intestazioni in uscita della risposta. Abilitare la registrazione per facilitare il debug.

Durante i test e la risoluzione dei problemi relativi al comportamento di memorizzazione nella cache, un browser può impostare intestazioni di richiesta che influiscono sulla memorizzazione nella cache in modi indesiderati. Ad esempio, un browser può impostare l'intestazione Cache-Control su no-cache o max-age=0 quando si aggiorna una pagina. Gli strumenti seguenti possono impostare in modo esplicito le intestazioni delle richieste e sono preferibili per il test della memorizzazione nella cache:

Condizioni per la memorizzazione nella cache

  • La richiesta deve generare una risposta del server con un codice di stato 200 (OK).
  • Il metodo della richiesta deve essere GET o HEAD.
  • In Startup.Configure, il middleware per la memorizzazione nella cache delle risposte deve essere posizionato prima del middleware che necessita della memorizzazione nella cache. Per altre informazioni, vedere Middleware ASP.NET Core.
  • L'intestazione Authorization non deve essere presente.
  • Cache-ControlI parametri di intestazione devono essere validi e la risposta deve essere contrassegnata public e non contrassegnata private.
  • L'intestazione Pragma: no-cache non deve essere presente se l'intestazione Cache-Control non è presente, perché l'intestazione esegue l'override Cache-Control dell'intestazione Pragma quando presente.
  • L'intestazione Set-Cookie non deve essere presente.
  • Vary I parametri di intestazione devono essere validi e non uguali a *.
  • Il Content-Length valore dell'intestazione (se impostato) deve corrispondere alle dimensioni del corpo della risposta.
  • L'oggetto IHttpSendFileFeature non viene usato.
  • La risposta non deve essere obsoleta come specificato dall'intestazione Expires e dalle max-age direttive della cache e s-maxage .
  • La bufferizzazione della risposta deve riuscire. Le dimensioni della risposta devono essere inferiori a quelle configurate o predefinite SizeLimit. Le dimensioni del corpo della risposta devono essere inferiori a quelle configurate o predefinite MaximumBodySize.
  • La risposta deve essere memorizzata nella cache in base a RFC 9111: memorizzazione nella cache HTTP. Ad esempio, la no-store direttiva non deve esistere nei campi di intestazione della richiesta o della risposta. Per informazioni dettagliate, vedere RFC 9111: Memorizzazione nella cache HTTP (sezione 3: Archiviazione di risposte nelle cache ).

Note

Il sistema Antiforgery per generare token sicuri per prevenire attacchi CSRF (Cross-Site Request Forgery) imposta le intestazioni Cache-Control e Pragma a no-cache affinché le risposte non siano memorizzate nella cache. Per informazioni su come disabilitare i token antiforgery per gli elementi del modulo HTML, vedere Impedire attacchi XSRF/CSRF (Cross-Site Request Forgery) in ASP.NET Core.

Risorse aggiuntive