Optimisation des performances ASP.NET Core via le middleware de compression des réponses

Principes du middleware de compression des réponses

Le middleware de compression intégré au framework ASP.NET Core intervient directement dans le pipeline HTTP pour réduire la taille des charges utiles transmises aux clients. En appliquant des formats standardisés tels que brotli ou gzip, il diminue significativement la consommation réseau et accélère le traitement des requêtes, en particulier lors du transfert de documents textuels ou de données structurées volumineuses.

Activation et intégration dans le pipeline

L'activation repose sur l'enregistrement du service dédié, suivi de son insertion dans la chaîne de traitement des requêtes. Voici une configuration minimale illustrant l'inscription et l'application du middleware avec un point de terminaison de démonstration :

using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Net.Http.Headers;

var constructeur = WebApplication.CreateBuilder(args);

// Enregistrement du service avec activation explicite pour HTTPS
constructeur.Services.AddResponseCompression(config =>
{
    config.EnableForHttps = true;
});

var application = constructeur.Build();

// Insertion du middleware dans le pipeline
application.UseResponseCompression();

application.MapGet("/transfert-donnees", async context =>
{
    context.Response.ContentType = "text/plain";
    
    // Gestion conditionnelle de l'entête Vary selon la requête
    var enteteRequete = context.Request.Headers[HeaderNames.AcceptEncoding];
    if (!string.IsNullOrWhiteSpace(enteteRequete))
    {
        context.Response.Headers[HeaderNames.Vary] = HeaderNames.AcceptEncoding;
    }

    // Génération d'un payload de test (1 000 000 caractères)
    var donneesSortie = new string('Z', 1_000_000);
    await context.Response.WriteAsync(donneesSortie);
});

await application.RunAsync();

Gestion des fournisseurs d'algorithmes

Par défaut, le framework privilégie l'algorithme Brotli pour son excellent ratio compression/décompression. Il est toutefois possible d'ajuster l'ordre des fournisseurs ou d'introduire Gzip pour garantir une compatibilité avec des clients plus anciens :

constructeur.Services.AddResponseCompression(config =>
{
    config.EnableForHttps = true;
    // Ajout explicite de Gzip en plus de Brotli (déjà présent par défaut)
    config.Providers.Add<GzipCompressionProvider>();
});

Création d'un fournisseur de compression personnalisé

Si les algorithmes standards ne répondent pas à un besoin spécifique, il est possible d'implémenter l'interface ICompressionProvider. La propriété EncodingName doit correspondre à la valeur attendue dans l'entête Accept-Encoding du client pour permettre la négociation correcte.

public class FournisseurSurMesure : ICompressionProvider
{
    public string EncodingName => "algoproprietaire";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream fluxSortie)
    {
        // Logique de wrapping ou de transformation personnalisée du flux
        return fluxSortie;
    }
}

L'enregistrement se réalise en ajoutant l'instance à la collection Providers. L'ordre d'ajout définit la priorité de sélection lors de la négociation :

constructeur.Services.AddResponseCompression(config =>
{
    config.Providers.Add<BrotliCompressionProvider>();
    config.Providers.Add<GzipCompressionProvider>();
    config.Providers.Add<FournisseurSurMesure>();
    
    // Extension de la liste des types MIME pris en charge
    config.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "image/svg+xml" });
});

Configuration des types MIME et restrictions

Le middleware filtre les réponses à compresser selon une liste explicite de types MIME. Cette liste est modifiable via la propriété MimeTypes. Il est important de noter que les caractères génériques (ex. text/*) ne sont pas supportés ; chaque type doit être déclaré individuellement.

constructeur.Services.AddResponseCompression(config =>
{
    config.EnableForHttps = true;
    config.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
        new[] { "application/json", "image/svg+xml" });
});

Paramètres avancés et entêtes HTTP

Plusieurs options influencent le comportement interne du middleware :

  • EnableForHttps : Active la compression sur les connexions chiffrées. Historiquement désactivée pour atténuer les risques liés aux attaques CRIME, elle peut être activée si l'architecture le permet.
  • Niveau de compression Gzip : Ajustable via GzipCompressionProviderOptions. Les valeurs disponibles sont Fastest (priorité vitesse), Optimal (priorité ratio) et NoCompression.
  • MimeTypes : Liste blanche des types de contenu éligibles à la transformation.

Lorsqu'une compression est appliquée, le serveur renseigne automatiquement l'entête de réponse Content-Encoding. Les valeurs standardisées sont résumées ci-dessous :

Valeur de l'entête Algorithme correspondant
br Brotli
gzip Gzip
deflate DEFLATE

Le middleware analyse systématiquement l'entête Accept-Encoding de la requête entrante, sélectionne le premier fournisseur compatible selon la liste enregistrée, applique la transformation sur le flux de sortie, puis transmet la réponse au client.

Étiquettes: ASP.NET Core Response Compression Middleware HTTP Compression Brotli gzip

Publié le 3 septembre à 02h13