ASP.NET Core : activer la compression des réponses en GZIP / Deflate / Brotli

ASP.NET Core : activer la compression des réponses en GZIP / Deflate / Brotli

Il peut être utile de supporter la compression des réponses lorsqu’elles sont volumineuses cela peut réduire considérablement le temps de téléchargement de celle-ci.

Activer la compression gzip

Pour activer la compression gzip c’est très simple le framework ASP.NET Core fournit des classes toute faite.

Dans le fichier Startup il suffit d’activer la compression des réponses de la manière suivante :

using Microsoft.AspNetCore.ResponseCompression;

...

public ConfigureServices(IServiceCollection services)
{
     services.AddResponseCompression();
}

Il est à noter que vous pouvez aussi configurer le niveau de compression Gzip de la manière suivante :

services.Configure<GzipCompressionProviderOptions>(o => o.Level = System.IO.Compression.CompressionLevel.Optimal);

Si votre site est en https vous pouvez activer la compression de la manière suivante :

services.AddResponseCompression(o =>
{
     o.EnableForHttps = true;
});

Puis dans la méthode Configure vous devez appeler la méthode d’extension suivante :

app.UseResponseCompression();

Activer la compression Brotli et Deflate

ASP.NET Core ne fournit pas de compression provider pour ces deux formats.
Il faut donc les écrire soit même.

Compression provider Brotli :

public class BrotliCompressionProvider : ICompressionProvider
{
    private readonly CompressionLevel _compressionLevel;
    public BrotliCompressionProvider(CompressionLevel compressionLevel = CompressionLevel.Fastest)
    {
        _compressionLevel = compressionLevel;
    }

    public string EncodingName => "br";
    public bool SupportsFlush => true;
    public Stream CreateStream(Stream outputStream)
    {
       return new BrotliStream(outputStream, _compressionLevel);
    }
}

Activer la compression Deflate

Compression provider Defalte :

public class DeflateCompressionProvider : ICompressionProvider
{
    private readonly CompressionLevel _compressionLevel;
    public DeflateCompressionProvider(CompressionLevel compressionLevel = CompressionLevel.Fastest)
    {
        _compressionLevel = compressionLevel;
    }

    public string EncodingName => "deflate";
    public bool SupportsFlush => true;
    public Stream CreateStream(Stream outputStream)
    {
       return new DeflateStream(outputStream, _compressionLevel);
    }
}

Attention la classe DeflateStream ne respectent pas bien la norme Deflate donc si vous utiliser un client autre que .Net il ne pourra pas décode votre archive.

Puis, il faut modifier la méthode AddResponseCompression de la manière suivante :

services.AddResponseCompression(o =>;
{
   o.Providers.Add(new BrotliCompressionProvider());
   o.Providers.Add(new DeflateCompressionProvider());
   o.EnableForHttps = true;
});

Récupérer une réponse compressée

Maintenant que nous avons une réponse compressée il n’y a qu’a l’utiliser.

Pour avoir un contenu compressé le client devra envoyé le header Accept-Encoding avec comme valeur gzip, ou deflate, ou br.
Il peut aussi envoyé les 3 “gzip,deflate,br” pour dire au serveur qu’il supporte les 3 formats.

Mais les clients de décompresse pas automatiquement les réponses :
– heureusement ma libraire Tiny.RestClient le fait automatiquement.
– La classe HttpClient permet de décompresser automatiquement un contenu compressé.
Mais son utilisation n’est pas évidente car il faut lui passer un handler spécifique :

HttpClientHandler handler = new HttpClientHandler()
{
   AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};


using (var client = new HttpClient(handler))
{
    ....
}

Attention pour l’instant la compression brotli n’est pas encore géré par HttpClient.

Quand faut-il activer la compression ?

La documentation précise qu’il ne faut pas compresser des fichiers inférieur à 1000 octets car cela peut produire un fichier compressé plus volumineux que le fichier non compressé.

Il est aussi à noter que la compression rajoute de la charge de calculs côté serveur.

Happy coding.

Pour aller plus loin

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Pin It on Pinterest