Compression des réponses dans 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 de réponse 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. Serveur HTTP.sys serveur et Kestrel serveur n’offrent actuellement pas prise en charge de la compression intégrée.HTTP.sys server server and Kestrel server don't currently offer built-in compression support.

Utilisez l’intergiciel (middleware) de compression de réponse dans les cas suivants :Use Response Compression Middleware when you're:

Compression des réponsesResponse compression

En règle générale, toute réponse ne compressée pas en mode natif peut bénéficier de la compression de réponse.Usually, any response not natively compressed can benefit from response compression. Pas en mode natif compressés en général, les réponses sont : CSS, JavaScript, HTML, XML et JSON.Responses not natively compressed typically include: CSS, JavaScript, HTML, XML, and JSON. Vous ne doivent pas compresser des ressources compressées en mode natif, telles que des 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, une petite réduction supplémentaire dans le temps de taille et la transmission sera probablement être été éclipsée par le temps de 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 pas compresser les fichiers inférieurs à environ 150-1000 octets (selon le contenu du fichier et 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 de la compression des fichiers de petite taille peut produire 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.

Quand un client peut traiter du contenu compressé, il doit en informer le serveur en envoyant l'en-tête Accept-Encoding avec la requête.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. Quand un serveur envoie du contenu compressé, il doit inclure dans l’en-tête Content-Encoding des informations sur le mode d’encodage de la réponse compressé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 d'encodage de contenu prises en charge par l’intergiciel sont affiché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 DEFLATEDEFLATE compressed data format
exi NonNo Échange efficace de XML W3CW3C Efficient XML Interchange
gzip OuiYes Format de fichier GZIPGzip file format
identity OuiYes Identificateur « Aucun codage » : La réponse ne doit pas être encodée."No encoding" identifier: The response must not be encoded.
pack200-gzip NonNo Format de transfert de réseau d’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 DEFLATEDEFLATE compressed data format
exi NonNo Échange efficace de XML W3CW3C Efficient XML Interchange
gzip Oui (valeur par défaut)Yes (default) Format de fichier GZIPGzip file format
identity OuiYes Identificateur « Aucun codage » : La réponse ne doit pas être encodée."No encoding" identifier: The response must not be encoded.
pack200-gzip NonNo Format de transfert de réseau d’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 IANA officielle des encodages de contenu.For more information, see the IANA Official Content Coding List.

L’intergiciel vous permet d’ajouter des fournisseurs de compression supplémentaires pour des 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 peut réagir à la pondération de la valeur de qualité (qvalue, q) envoyée 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 7231 relative aux RFC : Encodage.For more information, see RFC 7231: Accept-Encoding.

Les algorithmes de compression donnent lieu à un compromis entre vitesse de compression et 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 la 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 RôleRole
Accept-Encoding Envoyé à partir du client au serveur pour indiquer les schémas d’encodage 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 Au moment de la compression, l'en-tête Content-Length est supprimé car le contenu du corps change quand 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 par défaut des types MIME qui peut donc coder, 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 Quand l’en-tête Vary est envoyé par le serveur avec la valeur Accept-Encoding à des clients et proxys, ces derniers doivent mettre en cache les réponses (vary) en fonction de la valeur de l’en-tête Accept-Encoding de la requête.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. Si du contenu est retourné avec l'en-tête Vary: Accept-Encoding, 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 de réponse avec le 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 d’application à l’aide de Gzip et fournisseurs de compression personnalisé.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

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

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

Pour inclure l’intergiciel (middleware) dans un projet, ajoutez une référence à la Microsoft.AspNetCore.ResponseCompression package.To include the middleware in a project, add a reference to the Microsoft.AspNetCore.ResponseCompression package.

ConfigurationConfiguration

Le code suivant montre comment activer le Middleware de Compression de réponse pour les types MIME par défaut et les fournisseurs de compression (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 le Middleware de Compression de réponse 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.
  • Utiliser un outil tel que Fiddler, Firebug, ou Postman pour définir le Accept-Encoding en-tête de demande et d’étudier les en-têtes de réponse, la taille et le corps.Use a tool such as Fiddler, Firebug, or Postman to set the Accept-Encoding request header and study the response headers, size, and body.

Soumettez une requête à 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 sur 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.

Soumettre une demande de l’exemple d’application avec le Accept-Encoding: br en-tête (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 montrant 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 montrant le résultat d’une demande avec l’en-tête Accept-Encoding et la valeur gzip.

FournisseursProviders

Fournisseur de Compression BrotliBrotli Compression Provider

Utilisez le 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 ajoutés explicitement à la CompressionProviderCollection:If no compression providers are explicitly added to the CompressionProviderCollection:

  • Le fournisseur de Compression Brotli est ajouté par défaut dans le tableau de fournisseurs de compression avec la 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 par défaut de 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 par défaut 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é lorsque des fournisseurs de compression sont ajoutés explicitement :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" });
    });
}

Définir la compression au niveau avec BrotliCompressionProviderOptions.Set the compression level with BrotliCompressionProviderOptions. Le fournisseur de Compression Brotli par défaut est le niveau de compression plus rapide (CompressionLevel.Fastest), ce qui ne peut 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 la compression la plus efficace est souhaitée, configurez l’intergiciel de 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 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 le 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 ajoutés explicitement à la CompressionProviderCollection:If no compression providers are explicitly added to the CompressionProviderCollection:

  • Le fournisseur de la Compression Gzip est ajouté par défaut dans le tableau de fournisseurs de compression avec la 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 par défaut de 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 par défaut 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 la Compression Gzip est ajouté au tableau de fournisseurs de compression par défaut.The Gzip Compression Provider is added by default to the array of compression providers.
  • Par défaut, la compression est 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 la Compression Gzip doit être ajouté lorsque des fournisseurs de compression sont ajoutés explicitement :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<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

Définir la compression au niveau avec GzipCompressionProviderOptions.Set the compression level with GzipCompressionProviderOptions. Le fournisseur de la Compression Gzip par défaut est le niveau de compression plus rapide (CompressionLevel.Fastest), ce qui ne peut 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 la compression la plus efficace est souhaitée, configurez l’intergiciel de 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 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éer des implémentations de compression personnalisé 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 requête 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 Content-Encoding: mycustomcompression.The middleware uses the custom compression implementation and returns the response with a Content-Encoding: mycustomcompression header. Pour que cette implémentation fonctionne, le client doit pouvoir décompresser l’encodage personnalisé.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<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;
    }
}

Soumettez une requête à 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’y a 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, ce dernier montre où vous pouvez implémenter un tel algorithme de compression.However, the sample shows where you would implement such a compression algorithm.

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

types MIMEMIME types

L’intergiciel (middleware) spécifie un ensemble de types MIME pour la compression par défaut :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

Remplacer ou ajouter des types MIME avec les options de l’intergiciel de Compression des réponses.Replace or append MIME types with the Response Compression Middleware options. Notez que les caractères génériques MIME types, tels que 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 à ASP.NET Core image de bannière (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<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és sur le Accept-Encoding en-tête, 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 les caches de client et de proxy que plusieurs versions existent et doivent être stockées, les Vary en-tête est ajouté avec un Accept-Encoding valeur.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 (middleware) ajoute le Vary en-tête automatiquement lors de 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.

Lors de la compression des réponses basés sur le Accept-Encoding en-tête, 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 les caches de client et de proxy que plusieurs versions existent et doivent être stockées, les Vary en-tête est ajouté avec un Accept-Encoding valeur.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 1.x, ajout de la Vary en-tête à la réponse s’effectue manuellement :In ASP.NET Core 1.x, adding the Vary header to the response is accomplished manually:

// ONLY REQUIRED FOR ASP.NET CORE 1.x APPS
private void ManageVaryHeader(HttpContext context)
{
    // If the Accept-Encoding header is present, add the Vary header
    var accept = context.Request.Headers[HeaderNames.AcceptEncoding];
    if (!StringValues.IsNullOrEmpty(accept))
    {
        context.Response.Headers.Append(HeaderNames.Vary, HeaderNames.AcceptEncoding);
    }
}

Problème au niveau de l’intergiciel s'il est derrière un proxy inverse NginxMiddleware issue when behind an Nginx reverse proxy

Quand une requête est transmise par Nginx, l'en-tête Accept-Encoding est supprimé.When a request is proxied by Nginx, the Accept-Encoding header is removed. Suppression de la Accept-Encoding en-tête empêche l’intergiciel (middleware) de la compression de la réponse.Removal of the Accept-Encoding header prevents the middleware from compressing the response. Pour plus d’informations, consultez NGINX : La compression et décompression.For more information, see NGINX: Compression and Decompression. Ce problème est suivi par déterminer compression pass-through 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 avez une active IIS Compression Module dynamique configuré au niveau du serveur que vous souhaitez désactiver pour une application, désactiver le module avec un ajout à la web.config fichier.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 de problèmesTroubleshooting

Utilisez un outil tel que Fiddler, Firebug ou Postman pour définir l'en-tête Accept-Encoding de la requête et é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, intergiciel 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:

  • Le Accept-Encoding en-tête est présent avec la valeur br, gzip, *, ou de l’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 la valeur 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