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
- Documentation officielle ASP.NET Core
- Tiny.RestClient : Un client REST qui gère automatiquement la compression / décompression