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.
Uma redução de 4.6kb
ou +/- 70% sem mechermos no código!
Espero ter ajudado!
[]s e até a próxima.