Événement
Championnats du monde Power BI DataViz
14 févr., 16 h - 31 mars, 16 h
Avec 4 chances d’entrer, vous pourriez gagner un package de conférence et le rendre à la Live Grand Finale à Las Vegas
En savoir plusCe navigateur n’est plus pris en charge.
Effectuez une mise à niveau vers Microsoft Edge pour tirer parti des dernières fonctionnalités, des mises à jour de sécurité et du support technique.
Par John Luo et Rick Anderson
Cet article explique comment configurer l’intergiciel de mise en cache de sortie dans une application ASP.NET Core. L’intergiciel détermine quand les réponses peuvent être mises en cache, stocke les réponses et traite les réponses du cache. Pour une présentation de la mise en cache HTTP et de l’attribut [ResponseCache]
, consultez Mise en cache des réponses.
L’intergiciel de mise en cache des réponses :
Pour tester la mise en cache des réponses, utilisez Fiddler ou un autre outil qui peut définir explicitement des en-têtes de requête. La définition explicite d’en-têtes est recommandée pour tester la mise en cache. Pour plus d’informations, consultez la page Dépannage.
DansProgram.cs
, utilisez AddResponseCaching l’ajout des services d’intergiciel de mise en cache de réponse pour la collection de services et configurez l’application pour utiliser l’intergiciel avec la méthode d’extension UseResponseCaching. UseResponseCaching
ajoute l’intergiciel au pipeline de traitement des requêtes en appelant :
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddResponseCaching();
var app = builder.Build();
app.UseHttpsRedirection();
// UseCors must be called before UseResponseCaching
//app.UseCors();
app.UseResponseCaching();
Avertissement
UseCors doit être appelé avant UseResponseCaching lors de l’utilisation de l’intergiciel CORS.
L’exemple d’application ajoute des en-têtes pour contrôler la mise en cache sur les requêtes suivantes :
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();
Les en-têtes précédents ne sont pas écrits dans la réponse et sont remplacés lorsqu’un contrôleur, une action ou une page Razor :
Le middleware de mise en cache de réponse met uniquement en cache les réponses du serveur qui entraînent un code état 200 (OK). Toutes les autres réponses, y compris les pages d’erreur, sont ignorées par l’intergiciel.
Avertissement
Les réponses avec du contenu pour les clients authentifiés doivent être marquées comme ne pouvant pas être mises en cache pour empêcher l’intergiciel de stocker et de traiter ces réponses. Pour plus d’informations sur la façon dont l’intergiciel détermine si une réponse peut être mise en cache, consultez Conditions de mise en cache .
Le code précédent ne retourne généralement pas de valeur mise en cache à un navigateur. Utilisez Fiddler, ou un autre outil qui peut définir explicitement des en-têtes de requête et qui est préféré pour tester la mise en cache. Pour plus d'informations, consultez résolution des problèmes dans cet article.
Les options de mise en cache des réponses sont présentées dans le tableau suivant.
Option | Description |
---|---|
MaximumBodySize | La plus grande taille pouvant être mise en cache pour le corps de la réponse, en octets. La valeur par défaut est64 * 1024 * 1024 64 Mo. |
SizeLimit | Limite de taille de l’intergiciel du cache de réponse en octets. La valeur par défaut est 100 * 1024 * 1024 100 Mo. |
UseCaseSensitivePaths | Détermine si les réponses sont mises en cache sur des chemins respectant la casse. La valeur par défaut est false . |
L’exemple suivant configure l’intergiciel pour :
/page1
et /Page1
sont stockés séparément.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();
Lorsque vous utilisez MVC, des contrôleurs d’API web ou des modèles de page Razor, l’attribut [ResponseCache]
spécifie les paramètres nécessaires pour définir les en-têtes appropriés pour la mise en cache des réponses. Le seul paramètre de l’attribut [ResponseCache]
qui nécessite strictement le middleware est VaryByQueryKeys, qui ne correspond pas à un en-tête HTTP réel. Pour plus d’informations, consultez Mise en cache des réponses dans ASP.NET Core.
Lorsque vous n’utilisez pas l’attribut [ResponseCache]
, la mise en cache des réponses peut être modifiée avec VaryByQueryKeys
. Utilisez directement le ResponseCachingFeature à partir de HttpContext.Features :
var responseCachingFeature = context.HttpContext.Features.Get<IResponseCachingFeature>();
if (responseCachingFeature != null)
{
responseCachingFeature.VaryByQueryKeys = new[] { "MyKey" };
}
L’utilisation d’une valeur unique égale à *
dans VaryByQueryKeys
varie le cache par tous les paramètres de requête.
Le tableau suivant fournit des informations sur les en-têtes HTTP qui affectent la mise en cache des réponses.
En-tête | Détails |
---|---|
Authorization |
La réponse n’est pas mise en cache si l’en-tête existe. |
Cache-Control |
Le middleware prend uniquement en compte la mise en cache des réponses marquées avec la directive de cache public . Contrôlez la mise en cache avec les paramètres suivants :
max-stale , le middleware n’effectue aucune action.‡ proxy-revalidate produit le même effet que must-revalidate .Pour plus d’informations, consultez RFC 9111 : Directives de requête. |
Pragma |
Un en-tête Pragma: no-cache dans la requête produit le même effet queCache-Control: no-cache . Cet en-tête est remplacé par les directives pertinentes dans l’en-têteCache-Control , le cas échéant. Considéré pour la compatibilité descendante avec HTTP/1.0. |
Set-Cookie |
La réponse n’est pas mise en cache si l’en-tête existe. Tout middleware dans le pipeline de traitement des requêtes qui définit un ou plusieurs cookies empêche le middleware de mise en cache de réponse de mettre en cache la réponse (par exemple, le fournisseur TempData basé sur les cookie). |
Vary |
L’en-tête Vary est utilisé pour faire varier la réponse mise en cache par un autre en-tête. Par exemple, mettez en cache les réponses par encodage en incluant l’en-tête Vary: Accept-Encoding , qui met en cache les réponses pour les demandes avec des en-têtes Accept-Encoding: gzip et Accept-Encoding: text/plain séparément. Une réponse avec une valeur d’en-tête de * n’est jamais stockée. |
Expires |
Une réponse considérée comme obsolète par cet en-tête n’est ni stockée ni récupérée, sauf si elle est remplacée par d’autres en-têtesCache-Control . |
If-None-Match |
La réponse complète est servie à partir du cache si la valeur n’est pas * et si le ETag de la réponse ne correspond à aucune des valeurs fournies. Sinon, une réponse 304 (non modifiée) est traitée. |
If-Modified-Since |
Si l’en-tête If-None-Match n’est pas présent, une réponse complète est fournie à partir du cache si la date de réponse mise en cache est plus récente que la valeur fournie. Sinon, une réponse 304 - Non modifié est traitée. |
Date |
Lors de la distribution à partir du cache, l’en-tête Date est défini par l’intergiciel s’il n’a pas été fourni dans la réponse d’origine. |
Content-Length |
Lors de la distribution à partir du cache, l’en-tête Content-Length est défini par l’intergiciel s’il n’a pas été fourni dans la réponse d’origine. |
Age |
L’en-tête Age envoyé dans la réponse d’origine est ignoré. L’intergiciel calcule une nouvelle valeur lors de la distribution d’une réponse mise en cache. |
L’intergiciel respecte les règles de RFC 9111 : Mise en cache HTTP (Section 5.2. Cache-Control). Les règles nécessitent un cache pour respecter un en-tête Cache-Control
valide envoyé par le client. Un client peut effectuer des requêtes avec une valeur d’en-tête no-cache
et forcer le serveur à générer une nouvelle réponse pour chaque requête. Actuellement, il n’existe aucun contrôle de développeur sur ce comportement de mise en cache lors de l’utilisation du middleware, car le middleware respecte la spécification de mise en cache officielle.
Pour plus de contrôle sur le comportement de mise en cache, explorez d’autres fonctionnalités de mise en cache de ASP.NET Core. Consultez les rubriques suivantes :
L’ intergiciel de mise en cache de réponse utilise IMemoryCache, qui a une capacité limitée. Lorsque la capacité est dépassée, le cache de mémoire est compacté.
Si le comportement de mise en cache ne se déroule pas comme prévu, vérifiez que les réponses peuvent être mises en cache et qu’elles peuvent être traitées à partir du cache. Examinez les en-têtes entrants de la requête et les en-têtes sortants de la réponse. Activez la journalisation pour faciliter le débogage.
Lors du test et de la résolution des problèmes de comportement de mise en cache, un navigateur définit généralement des en-têtes de requête qui empêchent la mise en cache. Par exemple, un navigateur peut définir l’en-tête Cache-Control
sur no-cache
ou max-age=0
lors de l’actualisation d’une page. Fiddler et d’autres outils peuvent définir explicitement des en-têtes de requête et sont préférés pour tester la mise en cache.
Authorization
ne doit pas être présent.Cache-Control
doivent être valides et la réponse doit être marquée public
et non private
.Pragma: no-cache
ne doit pas être présent si l’en-tête Cache-Control
n’est pas présent, car l’en-tête Cache-Control
remplace l’en-tête Pragma
lorsqu’il est présent.Set-Cookie
ne doit pas être présent.Vary
doivent être valides et non égaux à *
.Content-Length
d’en-tête (si définie) doit correspondre à la taille du corps de la réponse.Expires
et les directives de cache max-age
et s-maxage
.no-store
ne doit pas exister dans les champs d’en-tête de requête ou de réponse. Pour plus d’informations , consultez RFC 9111 : Mise en cache HTTP (Section 3 : Stockage des réponses dans les caches ).Note
Le système Antiforgery pour générer des jetons sécurisés pour empêcher les attaques CSRF (falsification des requêtes intersites) définit les en-têtes Cache-Control
et Pragma
sur no-cache
afin que les réponses ne soient pas mises en cache. Pour plus d’informations sur la désactivation des jetons Antiforgery pour les éléments de formulaire HTML, consultez Empêcher les attaques par falsification de requête intersites (XSRF/CSRF) dans ASP.NET Core.
IResponseCachingPolicyProvider
IResponseCachingPolicyProvider
Cet article explique comment configurer l’intergiciel de mise en cache de réponse dans une application ASP.NET Core. L’intergiciel détermine quand les réponses peuvent être mises en cache, stocke les réponses et traite les réponses du cache. Pour une présentation de la mise en cache HTTP et de l’attribut [ResponseCache]
, consultez Mise en cache des réponses.
Affichez ou téléchargez l’exemple de code (procédure de téléchargement)
L’intergiciel de mise en cache de réponse est implicitement disponible pour les applications ASP.NET Core via l’infrastructure partagée.
Dans Startup.ConfigureServices
, ajoutez l’intergiciel de mise en cache de réponse à la collection de services :
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddRazorPages();
}
Configurez l’application pour utiliser l’intergiciel avec la méthode d’extension UseResponseCaching , qui ajoute l’intergiciel au pipeline de traitement des requêtes dans 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();
});
}
Avertissement
UseCors doit être appelé avant UseResponseCaching lors de l’utilisation de l’intergiciel CORS.
L’exemple d’application ajoute des en-têtes pour contrôler la mise en cache sur les requêtes suivantes :
// 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();
});
Les en-têtes précédents ne sont pas écrits dans la réponse et sont remplacés lorsqu’un contrôleur, une action ou une page Razor :
Le middleware de mise en cache de réponse met uniquement en cache les réponses du serveur qui entraînent un code état 200 (OK). Toutes les autres réponses, y compris les pages d’erreur, sont ignorées par l’intergiciel.
Avertissement
Les réponses avec du contenu pour les clients authentifiés doivent être marquées comme ne pouvant pas être mises en cache pour empêcher l’intergiciel de stocker et de traiter ces réponses. Pour plus d’informations sur la façon dont l’intergiciel détermine si une réponse peut être mise en cache, consultez Conditions de mise en cache .
Les options de mise en cache des réponses sont présentées dans le tableau suivant.
Option | Description |
---|---|
MaximumBodySize | La plus grande taille pouvant être mise en cache pour le corps de la réponse, en octets. La valeur par défaut est64 * 1024 * 1024 64 Mo. |
SizeLimit | Limite de taille de l’intergiciel du cache de réponse en octets. La valeur par défaut est 100 * 1024 * 1024 100 Mo. |
UseCaseSensitivePaths | Détermine si les réponses sont mises en cache sur des chemins respectant la casse. La valeur par défaut est false . |
L’exemple suivant configure l’intergiciel pour :
/page1
et /Page1
sont stockés séparément.services.AddResponseCaching(options =>
{
options.MaximumBodySize = 1024;
options.UseCaseSensitivePaths = true;
});
Lorsque vous utilisez MVC/des contrôleurs d’API web ou des modèles de page Razor, l’attribut [ResponseCache]
spécifie les paramètres nécessaires pour définir les en-têtes appropriés pour la mise en cache des réponses. Le seul paramètre de l’attribut [ResponseCache]
qui nécessite strictement l’intergiciel est VaryByQueryKeys, qui ne correspond pas à un en-tête HTTP réel. Pour plus d’informations, consultez Mise en cache des réponses dans ASP.NET Core.
Lorsque vous n’utilisez pas l’attribut [ResponseCache]
, la mise en cache des réponses peut être modifiée avec VaryByQueryKeys
. Utilisez directement le ResponseCachingFeature à partir de HttpContext.Features :
var responseCachingFeature = context.HttpContext.Features.Get<IResponseCachingFeature>();
if (responseCachingFeature != null)
{
responseCachingFeature.VaryByQueryKeys = new[] { "MyKey" };
}
L’utilisation d’une valeur unique égale à *
dans VaryByQueryKeys
varie le cache par tous les paramètres de requête.
Le tableau suivant fournit des informations sur les en-têtes HTTP qui affectent la mise en cache des réponses.
En-tête | Détails |
---|---|
Authorization |
La réponse n’est pas mise en cache si l’en-tête existe. |
Cache-Control |
Le middleware prend uniquement en compte la mise en cache des réponses marquées avec la directive de cache public . Contrôlez la mise en cache avec les paramètres suivants :
max-stale , le middleware n’effectue aucune action.‡ proxy-revalidate produit le même effet que must-revalidate .Pour plus d’informations, consultez RFC 9111 : Directives de requête. |
Pragma |
Un en-tête Pragma: no-cache dans la requête produit le même effet queCache-Control: no-cache . Cet en-tête est remplacé par les directives pertinentes dans l’en-têteCache-Control , le cas échéant. Considéré pour la compatibilité descendante avec HTTP/1.0. |
Set-Cookie |
La réponse n’est pas mise en cache si l’en-tête existe. Tout middleware dans le pipeline de traitement des requêtes qui définit un ou plusieurs cookies empêche le middleware de mise en cache de réponse de mettre en cache la réponse (par exemple, le fournisseur TempData basé sur les cookie). |
Vary |
L’en-tête Vary est utilisé pour faire varier la réponse mise en cache par un autre en-tête. Par exemple, mettez en cache les réponses par encodage en incluant l’en-tête Vary: Accept-Encoding , qui met en cache les réponses pour les demandes avec des en-têtes Accept-Encoding: gzip et Accept-Encoding: text/plain séparément. Une réponse avec une valeur d’en-tête de * n’est jamais stockée. |
Expires |
Une réponse considérée comme obsolète par cet en-tête n’est ni stockée ni récupérée, sauf si elle est remplacée par d’autres en-têtesCache-Control . |
If-None-Match |
La réponse complète est servie à partir du cache si la valeur n’est pas * et si le ETag de la réponse ne correspond à aucune des valeurs fournies. Sinon, une réponse 304 (non modifiée) est traitée. |
If-Modified-Since |
Si l’en-tête If-None-Match n’est pas présent, une réponse complète est fournie à partir du cache si la date de réponse mise en cache est plus récente que la valeur fournie. Sinon, une réponse 304 - Non modifié est traitée. |
Date |
Lors de la distribution à partir du cache, l’en-tête Date est défini par l’intergiciel s’il n’a pas été fourni dans la réponse d’origine. |
Content-Length |
Lors de la distribution à partir du cache, l’en-tête Content-Length est défini par l’intergiciel s’il n’a pas été fourni dans la réponse d’origine. |
Age |
L’en-tête Age envoyé dans la réponse d’origine est ignoré. L’intergiciel calcule une nouvelle valeur lors de la distribution d’une réponse mise en cache. |
L’intergiciel respecte les règles de RFC 9111 : Mise en cache HTTP (Section 5.2. Cache-Control). Les règles nécessitent un cache pour respecter un en-tête Cache-Control
valide envoyé par le client. Un client peut effectuer des requêtes avec une valeur d’en-tête no-cache
et forcer le serveur à générer une nouvelle réponse pour chaque requête. Actuellement, il n’existe aucun contrôle de développeur sur ce comportement de mise en cache lors de l’utilisation du middleware, car le middleware respecte la spécification de mise en cache officielle.
Pour plus de contrôle sur le comportement de mise en cache, explorez d’autres fonctionnalités de mise en cache de ASP.NET Core. Consultez les rubriques suivantes :
Si le comportement de mise en cache ne se déroule pas comme prévu, vérifiez que les réponses peuvent être mises en cache et qu’elles peuvent être traitées à partir du cache. Examinez les en-têtes entrants de la requête et les en-têtes sortants de la réponse. Activez la journalisation pour faciliter le débogage.
Lors du test et de la résolution des problèmes de comportement de mise en cache, un navigateur peut définir des en-têtes de requête qui affectent la mise en cache de manière indésirable. Par exemple, un navigateur peut définir l’en-tête Cache-Control
sur no-cache
ou max-age=0
lors de l’actualisation d’une page. Les outils suivants peuvent définir explicitement des en-têtes de requête et sont préférés pour tester la mise en cache :
Startup.Configure
, l’intergiciel de mise en cache de réponse doit être placé avant les intergiciels qui nécessitent une mise en cache. Pour plus d’informations, consultez Intergiciel (middleware) ASP.NET Core.Authorization
ne doit pas être présent.Cache-Control
doivent être valides et la réponse doit être marquée public
et non private
.Pragma: no-cache
ne doit pas être présent si l’en-tête Cache-Control
n’est pas présent, car l’en-tête Cache-Control
remplace l’en-tête Pragma
lorsqu’il est présent.Set-Cookie
ne doit pas être présent.Vary
doivent être valides et non égaux à *
.Content-Length
d’en-tête (si définie) doit correspondre à la taille du corps de la réponse.Expires
et les directives de cache max-age
et s-maxage
.no-store
ne doit pas exister dans les champs d’en-tête de requête ou de réponse. Pour plus d’informations , consultez RFC 9111 : Mise en cache HTTP (Section 3 : Stockage des réponses dans les caches ).Note
Le système Antiforgery pour générer des jetons sécurisés pour empêcher les attaques CSRF (falsification des requêtes intersites) définit les en-têtes Cache-Control
et Pragma
sur no-cache
afin que les réponses ne soient pas mises en cache. Pour plus d’informations sur la désactivation des jetons Antiforgery pour les éléments de formulaire HTML, consultez Empêcher les attaques par falsification de requête intersites (XSRF/CSRF) dans ASP.NET Core.
Commentaires sur ASP.NET Core
ASP.NET Core est un projet open source. Sélectionnez un lien pour fournir des commentaires :
Événement
Championnats du monde Power BI DataViz
14 févr., 16 h - 31 mars, 16 h
Avec 4 chances d’entrer, vous pourriez gagner un package de conférence et le rendre à la Live Grand Finale à Las Vegas
En savoir plusFormation
Module
Améliorer le niveau de performance avec un cache dans un projet Aspire .NET - Training
Dans ce module, vous découvrirez les caches dans une application native cloud Aspire .NET et comment les utiliser pour optimiser le niveau de performance de vos microservices.
Documentation
Mise en cache des réponses dans ASP.NET Core
Découvrez comment utiliser la mise en cache des réponses pour réduire les besoins en bande passante et accroître les performances des applications ASP.NET Core.
Intergiciel de mise en cache de sorite dans ASP.NET Core
Découvrez comment configurer et utiliser l’intergiciel de mise en cache de sortie dans ASP.NET Core.
Vue d’ensemble de la mise en cache dans ASP.NET Core
Vue d’ensemble de la mise en cache dans ASP.NET Core