Compression des réponses en ASP.NET CoreResponse compression in ASP.NET Core

Par Luke LathamBy Luke Latham

Affichez ou téléchargez l’exemple de code (procédure de téléchargement)View or download sample code (how to download)

La bande passante réseau est une ressource limitée.Network bandwidth is a limited resource. Le fait de réduire la taille de la réponse augmente généralement la réactivité d’une application, parfois de manière considérable.Reducing the size of the response usually increases the responsiveness of an app, often dramatically. Une façon de réduire la taille de la charge utile consiste à compresser les réponses de l’application.One way to reduce payload sizes is to compress an app's responses.

Quand utiliser l’intergiciel (middleware) de compression de réponseWhen to use Response Compression Middleware

Utilisez les technologies de compression des réponses basées sur le serveur dans IIS, Apache ou nginx.Use server-based response compression technologies in IIS, Apache, or Nginx. Les performances de l’intergiciel (middleware) ne correspondront probablement pas à celles des modules de serveur.The performance of the middleware probably won't match that of the server modules. Le serveur de serveur http. sys et le serveur Kestrel n’offrent pas de prise en charge intégrée de la compression.HTTP.sys server server and Kestrel server don't currently offer built-in compression support.

Utilisez l’intergiciel (middleware) de compression des réponses lorsque vous êtes :Use Response Compression Middleware when you're:

Compression des réponsesResponse compression

En règle générale, toute réponse qui n’est pas compressée en mode natif peut tirer parti de la compression des réponses.Usually, any response not natively compressed can benefit from response compression. Les réponses qui ne sont pas compressées en mode natif incluent généralement : CSS, JavaScript, HTML, XML et JSON.Responses not natively compressed typically include: CSS, JavaScript, HTML, XML, and JSON. Vous ne devez pas compresser les ressources natives compressées, telles que les fichiers PNG.You shouldn't compress natively compressed assets, such as PNG files. Si vous tentez de compresser davantage une réponse compressée en mode natif, toute petite réduction supplémentaire de taille et de temps de transmission sera probablement survenue du temps nécessaire au traitement de la compression.If you attempt to further compress a natively compressed response, any small additional reduction in size and transmission time will likely be overshadowed by the time it took to process the compression. Ne compressez pas les fichiers d’une taille inférieure à environ 150-1000 octets (en fonction du contenu du fichier et de l’efficacité de la compression).Don't compress files smaller than about 150-1000 bytes (depending on the file's content and the efficiency of compression). La surcharge liée à la compression de petits fichiers peut entraîner la création d’un fichier compressé plus volumineux que le fichier non compressé.The overhead of compressing small files may produce a compressed file larger than the uncompressed file.

Lorsqu’un client peut traiter du contenu compressé, le client doit informer le serveur de ses fonctionnalités en envoyant l’en-tête Accept-Encoding avec la demande.When a client can process compressed content, the client must inform the server of its capabilities by sending the Accept-Encoding header with the request. Lorsqu’un serveur envoie du contenu compressé, il doit inclure des informations dans l’en-tête Content-Encoding sur la façon dont la réponse compressée est encodée.When a server sends compressed content, it must include information in the Content-Encoding header on how the compressed response is encoded. Les désignations de codage de contenu prises en charge par l’intergiciel (middleware) sont indiquées dans le tableau suivant.Content encoding designations supported by the middleware are shown in the following table.

valeurs d’en-tête Accept-EncodingAccept-Encoding header values Intergiciel pris en chargeMiddleware Supported DescriptionDescription
br Oui (valeur par défaut)Yes (default) Format de données compressées BrotliBrotli compressed data format
deflate NonNo Format de données compressées compresséDEFLATE compressed data format
exi NonNo Échange XML efficace W3CW3C Efficient XML Interchange
gzip OuiYes Format de fichier gzipGzip file format
identity OuiYes Identificateur "No encoding" : la réponse ne doit pas être encodée."No encoding" identifier: The response must not be encoded.
pack200-gzip NonNo Format de transfert réseau pour les archives JavaNetwork Transfer Format for Java Archives
* OuiYes N'importe quel encodage de contenu disponible non explicitement demandéAny available content encoding not explicitly requested
valeurs d’en-tête Accept-EncodingAccept-Encoding header values Intergiciel pris en chargeMiddleware Supported DescriptionDescription
br NonNo Format de données compressées BrotliBrotli compressed data format
deflate NonNo Format de données compressées compresséDEFLATE compressed data format
exi NonNo Échange XML efficace W3CW3C Efficient XML Interchange
gzip Oui (valeur par défaut)Yes (default) Format de fichier gzipGzip file format
identity OuiYes Identificateur "No encoding" : la réponse ne doit pas être encodée."No encoding" identifier: The response must not be encoded.
pack200-gzip NonNo Format de transfert réseau pour les archives JavaNetwork Transfer Format for Java Archives
* OuiYes N'importe quel encodage de contenu disponible non explicitement demandéAny available content encoding not explicitly requested

Pour plus d’informations, consultez la liste de codage de contenu officielle IANA.For more information, see the IANA Official Content Coding List.

L’intergiciel (middleware) vous permet d’ajouter des fournisseurs de compression supplémentaires pour les valeurs d’en-tête Accept-Encoding personnalisées.The middleware allows you to add additional compression providers for custom Accept-Encoding header values. Pour plus d’informations, consultez fournisseurs personnalisés ci-dessous.For more information, see Custom Providers below.

L’intergiciel (middleware) peut réagir à la valeur de qualité (qvalue, q) pondérée lorsqu’il est envoyé par le client pour hiérarchiser les schémas de compression.The middleware is capable of reacting to quality value (qvalue, q) weighting when sent by the client to prioritize compression schemes. Pour plus d’informations, consultez RFC 7231 : Accept-Encoding.For more information, see RFC 7231: Accept-Encoding.

Les algorithmes de compression sont soumis à un compromis entre la vitesse de compression et l’efficacité de la compression.Compression algorithms are subject to a tradeoff between compression speed and the effectiveness of the compression. L' efficacité dans ce contexte fait référence à la taille de la sortie après compression.Effectiveness in this context refers to the size of the output after compression. La plus petite taille est obtenue par la compression la plus optimale .The smallest size is achieved by the most optimal compression.

Les en-têtes impliqués dans la demande, l'envoi, la mise en cache et la réception de contenu compressé sont décrits dans le tableau ci-dessous.The headers involved in requesting, sending, caching, and receiving compressed content are described in the table below.

HeaderHeader RoleRole
Accept-Encoding Envoyée du client au serveur pour indiquer les schémas de codage de contenu acceptables pour le client.Sent from the client to the server to indicate the content encoding schemes acceptable to the client.
Content-Encoding Envoyé à partir du serveur au client pour indiquer l'encodage du contenu de la charge utile.Sent from the server to the client to indicate the encoding of the content in the payload.
Content-Length En cas de compression, l’en-tête Content-Length est supprimé, car le contenu du corps change lorsque la réponse est compressée.When compression occurs, the Content-Length header is removed, since the body content changes when the response is compressed.
Content-MD5 Durant la compression, l’en-tête Content-MD5 est supprimé puisque le contenu du corps a changé et que le hachage n’est plus valide.When compression occurs, the Content-MD5 header is removed, since the body content has changed and the hash is no longer valid.
Content-Type Spécifie le type MIME du contenu.Specifies the MIME type of the content. Chaque réponse doit spécifier son Content-Type.Every response should specify its Content-Type. L’intergiciel vérifie cette valeur pour déterminer si la réponse doit être compressée.The middleware checks this value to determine if the response should be compressed. L’intergiciel (middleware) spécifie un ensemble de types MIME par défaut qu’il peut encoder, mais vous pouvez remplacer ou ajouter des types MIME.The middleware specifies a set of default MIME types that it can encode, but you can replace or add MIME types.
Vary Lorsqu’il est envoyé par le serveur avec une valeur de Accept-Encoding aux clients et proxys, l’en-tête Vary indique au client ou au proxy qu’il doit mettre en cache (variation) les réponses en fonction de la valeur de l’en-tête Accept-Encoding de la demande.When sent by the server with a value of Accept-Encoding to clients and proxies, the Vary header indicates to the client or proxy that it should cache (vary) responses based on the value of the Accept-Encoding header of the request. Le résultat de la restitution du contenu avec l’en-tête Vary: Accept-Encoding est que les réponses compressées et non compressées sont mises en cache séparément.The result of returning content with the Vary: Accept-Encoding header is that both compressed and uncompressed responses are cached separately.

Explorez les fonctionnalités de l’intergiciel de compression des réponses avec l' exemple d’application.Explore the features of the Response Compression Middleware with the sample app. L’exemple illustre :The sample illustrates:

  • La compression des réponses de l’application à l’aide de gzip et des fournisseurs de compression personnalisés.The compression of app responses using Gzip and custom compression providers.
  • Comment ajouter un type MIME à la liste par défaut des types MIME pour la compression.How to add a MIME type to the default list of MIME types for compression.

PackagePackage

L’intergiciel (middleware) de compression des réponses est fourni par le package Microsoft. AspNetCore. ResponseCompression , qui est implicitement inclus dans les applications ASP.net core.Response Compression Middleware is provided by the Microsoft.AspNetCore.ResponseCompression package, which is implicitly included in ASP.NET Core apps.

Pour inclure l’intergiciel (middleware) dans un projet, ajoutez une référence au AspNetCore Microsoft. AspNetCore. app, qui inclut le package Microsoft. ResponseCompression .To include the middleware in a project, add a reference to the Microsoft.AspNetCore.App metapackage, which includes the Microsoft.AspNetCore.ResponseCompression package.

ConfigurationConfiguration

Le code suivant montre comment activer l’intergiciel (middleware) de compression des réponses pour les types MIME et les fournisseurs de compression par défaut (Brotli et gzip) :The following code shows how to enable the Response Compression Middleware for default MIME types and compression providers (Brotli and Gzip):

Le code suivant montre comment activer l’intergiciel (middleware) de compression des réponses pour les types MIME par défaut et le fournisseur de compression gzip:The following code shows how to enable the Response Compression Middleware for default MIME types and the Gzip Compression Provider:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

Remarques :Notes:

  • app.UseResponseCompression doit être appelé avant app.UseMvc.app.UseResponseCompression must be called before app.UseMvc.
  • Utilisez un outil tel que Fiddler, Firebugou postal pour définir le Accept-Encoding en-tête de demande et étudier les en-têtes, la taille et le corps de la réponse.Use a tool such as Fiddler, Firebug, or Postman to set the Accept-Encoding request header and study the response headers, size, and body.

Envoyez une demande à l’exemple d’application sans l’en-tête Accept-Encoding et observez que la réponse n’est pas compressée.Submit a request to the sample app without the Accept-Encoding header and observe that the response is uncompressed. Les en-têtes Content-Encoding et Vary ne sont pas présents dans la réponse.The Content-Encoding and Vary headers aren't present on the response.

Fenêtre Fiddler indiquant le résultat d’une requête sans l’en-tête Accept-Encoding.

Envoyez une demande à l’exemple d’application avec l’en-tête Accept-Encoding: br (compression Brotli) et observez que la réponse est compressée.Submit a request to the sample app with the Accept-Encoding: br header (Brotli compression) and observe that the response is compressed. Les en-têtes Content-Encoding et Vary sont présents sur la réponse.The Content-Encoding and Vary headers are present on the response.

Fenêtre Fiddler présentant le résultat d’une demande avec l’en-tête Accept-Encoding et la valeur br.

Soumettez une requête à l’exemple d’application avec l’en-tête Accept-Encoding: gzip et observez que la réponse est compressée.Submit a request to the sample app with the Accept-Encoding: gzip header and observe that the response is compressed. Les en-têtes Content-Encoding et Vary sont présents sur la réponse.The Content-Encoding and Vary headers are present on the response.

Fenêtre Fiddler présentant le résultat d’une demande avec l’en-tête Accept-Encoding et une valeur de gzip.

FournisseursProviders

Fournisseur de compression BrotliBrotli Compression Provider

Utilisez la BrotliCompressionProvider pour compresser les réponses avec le format de données compressées Brotli.Use the BrotliCompressionProvider to compress responses with the Brotli compressed data format.

Si aucun fournisseur de compression n’est explicitement ajouté au CompressionProviderCollection:If no compression providers are explicitly added to the CompressionProviderCollection:

  • Le fournisseur de compression Brotli est ajouté par défaut au groupe de fournisseurs de compression avec le fournisseur de compression gzip.The Brotli Compression Provider is added by default to the array of compression providers along with the Gzip compression provider.
  • La compression prend par défaut la compression Brotli lorsque le format de données compressées Brotli est pris en charge par le client.Compression defaults to Brotli compression when the Brotli compressed data format is supported by the client. Si Brotli n’est pas pris en charge par le client, la compression est définie par défaut sur gzip lorsque le client prend en charge la compression gzip.If Brotli isn't supported by the client, compression defaults to Gzip when the client supports Gzip compression.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Le fournisseur de compression Brotoli doit être ajouté lors de l’ajout explicite de fournisseurs de compression :The Brotoli Compression Provider must be added when any compression providers are explicitly added:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Définissez le niveau de compression avec BrotliCompressionProviderOptions.Set the compression level with BrotliCompressionProviderOptions. Par défaut, le fournisseur de compression Brotli a le niveau de compression le plus rapide (CompressionLevel. plus rapide), qui peut ne pas produire la compression la plus efficace.The Brotli Compression Provider defaults to the fastest compression level (CompressionLevel.Fastest), which might not produce the most efficient compression. Si vous souhaitez obtenir la compression la plus efficace possible, configurez l’intergiciel (middleware) pour une compression optimale.If the most efficient compression is desired, configure the middleware for optimal compression.

Niveau de compressionCompression Level DescriptionDescription
CompressionLevel.FastestCompressionLevel.Fastest La compression doit se terminer aussi rapidement que possible, même si le résultat n’est pas compressé de manière optimale.Compression should complete as quickly as possible, even if the resulting output isn't optimally compressed.
CompressionLevel.NoCompressionCompressionLevel.NoCompression Aucune compression ne doit être effectuée.No compression should be performed.
CompressionLevel.OptimalCompressionLevel.Optimal Les réponses doivent être compressées de façon optimale, même si la compression prend plus de temps.Responses should be optimally compressed, even if the compression takes more time to complete.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Fournisseur de compression gzipGzip Compression Provider

Utilisez la GzipCompressionProvider pour compresser les réponses avec le format de fichier gzip.Use the GzipCompressionProvider to compress responses with the Gzip file format.

Si aucun fournisseur de compression n’est explicitement ajouté au CompressionProviderCollection:If no compression providers are explicitly added to the CompressionProviderCollection:

  • Le fournisseur de compression gzip est ajouté par défaut au tableau de fournisseurs de compression avec le fournisseur de compression Brotli.The Gzip Compression Provider is added by default to the array of compression providers along with the Brotli Compression Provider.
  • La compression prend par défaut la compression Brotli lorsque le format de données compressées Brotli est pris en charge par le client.Compression defaults to Brotli compression when the Brotli compressed data format is supported by the client. Si Brotli n’est pas pris en charge par le client, la compression est définie par défaut sur gzip lorsque le client prend en charge la compression gzip.If Brotli isn't supported by the client, compression defaults to Gzip when the client supports Gzip compression.
  • Le fournisseur de compression gzip est ajouté par défaut au tableau de fournisseurs de compression.The Gzip Compression Provider is added by default to the array of compression providers.
  • La compression est définie par défaut sur gzip lorsque le client prend en charge la compression gzip.Compression defaults to Gzip when the client supports Gzip compression.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

Le fournisseur de compression gzip doit être ajouté lors de l’ajout explicite de fournisseurs de compression :The Gzip Compression Provider must be added when any compression providers are explicitly added:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Définissez le niveau de compression avec GzipCompressionProviderOptions.Set the compression level with GzipCompressionProviderOptions. Par défaut, le fournisseur de compression gzip a le niveau de compression le plus rapide (CompressionLevel. plus rapide), qui peut ne pas produire la compression la plus efficace.The Gzip Compression Provider defaults to the fastest compression level (CompressionLevel.Fastest), which might not produce the most efficient compression. Si vous souhaitez obtenir la compression la plus efficace possible, configurez l’intergiciel (middleware) pour une compression optimale.If the most efficient compression is desired, configure the middleware for optimal compression.

Niveau de compressionCompression Level DescriptionDescription
CompressionLevel.FastestCompressionLevel.Fastest La compression doit se terminer aussi rapidement que possible, même si le résultat n’est pas compressé de manière optimale.Compression should complete as quickly as possible, even if the resulting output isn't optimally compressed.
CompressionLevel.NoCompressionCompressionLevel.NoCompression Aucune compression ne doit être effectuée.No compression should be performed.
CompressionLevel.OptimalCompressionLevel.Optimal Les réponses doivent être compressées de façon optimale, même si la compression prend plus de temps.Responses should be optimally compressed, even if the compression takes more time to complete.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Fournisseurs personnalisésCustom providers

Créez des implémentations de compression personnalisées avec ICompressionProvider.Create custom compression implementations with ICompressionProvider. EncodingName représente le contenu que cet encodage ICompressionProvider produit.The EncodingName represents the content encoding that this ICompressionProvider produces. L’intergiciel utilise ces informations pour choisir le fournisseur en fonction de la liste spécifiée dans l'en-tête Accept-Encoding de la requête.The middleware uses this information to choose the provider based on the list specified in the Accept-Encoding header of the request.

À l’aide de l’exemple d’application, le client envoie une demande avec l’en-tête Accept-Encoding: mycustomcompression.Using the sample app, the client submits a request with the Accept-Encoding: mycustomcompression header. L’intergiciel utilise l’implémentation de compression personnalisée et retourne la réponse avec un en-tête de Content-Encoding: mycustomcompression.The middleware uses the custom compression implementation and returns the response with a Content-Encoding: mycustomcompression header. Le client doit être en mesure de décompresser l’encodage personnalisé pour qu’une implémentation de compression personnalisée fonctionne.The client must be able to decompress the custom encoding in order for a custom compression implementation to work.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

Envoyez une demande à l’exemple d’application avec l’en-tête Accept-Encoding: mycustomcompression et observez les en-têtes de réponse.Submit a request to the sample app with the Accept-Encoding: mycustomcompression header and observe the response headers. Les en-têtes Vary et Content-Encoding sont présents sur la réponse.The Vary and Content-Encoding headers are present on the response. Le corps de la réponse (non affiché) n’est pas compressé par l’exemple.The response body (not shown) isn't compressed by the sample. Il n’existe pas d’implémentation de compression dans la classe CustomCompressionProvider de l’exemple.There isn't a compression implementation in the CustomCompressionProvider class of the sample. Toutefois, l’exemple illustre l’emplacement où vous implémentez un tel algorithme de compression.However, the sample shows where you would implement such a compression algorithm.

Fenêtre Fiddler présentant le résultat d’une demande avec l’en-tête Accept-Encoding et une valeur de mycustomcompression.

types MIMEMIME types

L’intergiciel (middleware) spécifie un ensemble de types MIME par défaut pour la compression :The middleware specifies a default set of MIME types for compression:

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

Remplacez ou ajoutez des types MIME par les options de l’intergiciel (middleware) de compression des réponses.Replace or append MIME types with the Response Compression Middleware options. Notez que les types MIME génériques, tels que les text/* ne sont pas pris en charge.Note that wildcard MIME types, such as text/* aren't supported. L’exemple d’application ajoute un type MIME pour image/svg+xml et compresse et sert l’image de bannière ASP.NET Core (Banner. svg).The sample app adds a MIME type for image/svg+xml and compresses and serves the ASP.NET Core banner image (banner.svg).

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Compression avec protocole sécuriséCompression with secure protocol

Les réponses compressées sur des connexions sécurisées peuvent être contrôlées à l'aide de l'option EnableForHttps (désactivée par défaut).Compressed responses over secure connections can be controlled with the EnableForHttps option, which is disabled by default. L’utilisation de la compression avec des pages générées dynamiquement peut mener à des problèmes de sécurité tels que les attaques CRIME et BREACH.Using compression with dynamically generated pages can lead to security problems such as the CRIME and BREACH attacks.

Ajout de l’en-tête VaryAdding the Vary header

Lors de la compression des réponses basées sur l’en-tête Accept-Encoding, il existe potentiellement plusieurs versions compressées de la réponse et une version non compressée.When compressing responses based on the Accept-Encoding header, there are potentially multiple compressed versions of the response and an uncompressed version. Pour indiquer au client et aux caches proxy que plusieurs versions existent et doivent être stockées, l’en-tête Vary est ajouté avec une valeur de Accept-Encoding.In order to instruct client and proxy caches that multiple versions exist and should be stored, the Vary header is added with an Accept-Encoding value. Dans ASP.NET Core 2,0 ou version ultérieure, l’intergiciel ajoute l’en-tête de Vary automatiquement lorsque la réponse est compressée.In ASP.NET Core 2.0 or later, the middleware adds the Vary header automatically when the response is compressed.

Problème d’intergiciel lors de l’arrière-plan d’un proxy inverse NginxMiddleware issue when behind an Nginx reverse proxy

Lorsqu’une demande est traitée par un proxy par nginx, l’en-tête Accept-Encoding est supprimé.When a request is proxied by Nginx, the Accept-Encoding header is removed. La suppression de l’en-tête Accept-Encoding empêche l’intergiciel de compresser la réponse.Removal of the Accept-Encoding header prevents the middleware from compressing the response. Pour plus d’informations, consultez Nginx : compression et décompression.For more information, see NGINX: Compression and Decompression. Ce problème est suivi par la compression directe pour Nginx (ASPNET/BasicMiddleware #123).This issue is tracked by Figure out pass-through compression for Nginx (aspnet/BasicMiddleware #123).

Utilisation de la compression dynamique IISWorking with IIS dynamic compression

Si vous disposez d’un module de compression dynamique IIS configuré au niveau du serveur que vous souhaitez désactiver pour une application, désactivez le module avec un ajout au fichier Web. config .If you have an active IIS Dynamic Compression Module configured at the server level that you would like to disable for an app, disable the module with an addition to the web.config file. Pour plus d’informations, consultez Désactivation de modules IIS.For more information, see Disabling IIS modules.

Résolution des problèmesTroubleshooting

Utilisez un outil tel que Fiddler, Firebugou postal, qui vous permet de définir l’en-tête de demande Accept-Encoding et d’étudier les en-têtes, la taille et le corps de la réponse.Use a tool like Fiddler, Firebug, or Postman, which allow you to set the Accept-Encoding request header and study the response headers, size, and body. Par défaut, l’intergiciel (middleware) de compression des réponses compresse les réponses qui remplissent les conditions suivantes :By default, Response Compression Middleware compresses responses that meet the following conditions:

  • L’en-tête Accept-Encoding est présent avec une valeur de br, gzip, *ou un encodage personnalisé qui correspond à un fournisseur de compression personnalisé que vous avez établi.The Accept-Encoding header is present with a value of br, gzip, *, or custom encoding that matches a custom compression provider that you've established. La valeur ne doit pas être identity ou avoir une valeur de qualité (qvalue, q) égale à 0 (zéro).The value must not be identity or have a quality value (qvalue, q) setting of 0 (zero).
  • Le type MIME (Content-Type) doit être défini et doit correspondre à un type MIME configuré sur le ResponseCompressionOptions.The MIME type (Content-Type) must be set and must match a MIME type configured on the ResponseCompressionOptions.
  • La requête ne doit pas inclure l'en-tête Content-Range.The request must not include the Content-Range header.
  • La requête doit utiliser un protocole non sécurisé (http), sauf si un protocole sécurisé (https) est configuré dans les options de l’intergiciel de compression de la réponse.The request must use insecure protocol (http), unless secure protocol (https) is configured in the Response Compression Middleware options. Notez le danger décrit ci-dessus lors de l’activation de la compression de contenu sécurisée.Note the danger described above when enabling secure content compression.
  • L’en-tête Accept-Encoding est présent avec une valeur de gzip, *ou un encodage personnalisé qui correspond à un fournisseur de compression personnalisé que vous avez établi.The Accept-Encoding header is present with a value of gzip, *, or custom encoding that matches a custom compression provider that you've established. La valeur ne doit pas être identity ou avoir une valeur de qualité (qvalue, q) égale à 0 (zéro).The value must not be identity or have a quality value (qvalue, q) setting of 0 (zero).
  • Le type MIME (Content-Type) doit être défini et doit correspondre à un type MIME configuré sur le ResponseCompressionOptions.The MIME type (Content-Type) must be set and must match a MIME type configured on the ResponseCompressionOptions.
  • La requête ne doit pas inclure l'en-tête Content-Range.The request must not include the Content-Range header.
  • La requête doit utiliser un protocole non sécurisé (http), sauf si un protocole sécurisé (https) est configuré dans les options de l’intergiciel de compression de la réponse.The request must use insecure protocol (http), unless secure protocol (https) is configured in the Response Compression Middleware options. Notez le danger décrit ci-dessus lors de l’activation de la compression de contenu sécurisée.Note the danger described above when enabling secure content compression.

Ressources supplémentairesAdditional resources