Asp.net Core PERFORMANCE - ResponseCompression

Asp.net Core PERFORMANCE - ResponseCompression

Olá pessoALL,

No post anterior, aprendemos sobre o uso do header ETag, hoje quero falar um pouco sobre o header Accept-Encoding.

Como falei no post anterior, quando tentamos otimizar respostas das nossas aplicações, qualquer diminuição no tamanho dos dados devolvidos traz um ganho enorme em velocidade, para isso temos 2 coisas simples a fazer:

  • Diminuir o tamanho dos dados, trazendo só as propriedades necessárias.
  • Comprimir a resposta.

Quer aprender mais sobre azure e .net? Confere o curso especial que estamos lançando: http://bit.ly/azdev

O segundo caso não necessita de nenhuma mudança nas nossas rotas e chamadas e é nela que iremos focar hoje!

Existe um middleware oficial, você pode conferir a documentação aqui, nesse post irei focar na implemetação.

Todo o código esta no github: https://github.com/rsantosdev/aspnetcore-responsecompression

1 - O middleware
A maioria dos browsers ja suporta o algoritmo de compressão Brotli e na atualização do .net core 2.1 ja temos o BrotliStream então iremos dar preferência a ele, invés do GZip.

    public class BrotliCompressionProvider : ICompressionProvider
    {
        public string EncodingName => "br";
        public bool SupportsFlush => true;

        public Stream CreateStream(Stream outputStream) => new BrotliStream(outputStream, CompressionLevel.Fastest, true);
    }

2 - O Uso
Aqui temos 2 passos, habilitar as dependências e adicionar o uso propriamente dito do middleware.

            services.AddResponseCompression(opts =>
            {
                opts.Providers.Add<BrotliCompressionProvider>();

                // Check https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?tabs=aspnetcore2x&view=aspnetcore-2.1#compression-with-secure-protocol
                // for considerations on enable compression over dynamic generated content.
                opts.EnableForHttps = true;
            });

Como dito no comentário, vale a pena ler a documentação sobre as possiveis vulnerabilidades de habilitar compressão em https, para o meu caso não tinha problema e habilitamos.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            // other middlewares

            // Enable ResponseCompression
            app.UseResponseCompression();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

3 - Na prática
Observe a diminuição do tamanho das requisições, sem termos mechido no código.

compression_before_after

Uma redução de 4.6kb ou +/- 70% sem mechermos no código!

Espero ter ajudado!
[]s e até a próxima.