Um dos maiores desafios de uma WebApi é como fazer com que os clientes usem a API o mínimo possível para não haver sobrecarga. Uma das formas mais simples de fazer com que o servidor fique menos carregado é comprimir a resposta dada pela WebApi. Vamos aprender como neste artigo.
A compactação GZIP, que vamos aplicar numa WebApi, permite compactar a resposta das chamadas em até 90%. Estamos diminuindo o tempo de comunicação de dados entre API e cliente em troca do processamento extra na API compactando os dados. Ou seja, se sua WebApi está hospedada num servidor com um processador muito fraco, o resultado pode não ser o esperado.
Isto posto, vamos imaginar o seguinte cenário. Eu criei uma WebApi bem simples, devolvendo uma lista de objetos do tipo Pessoa
.
public class Pessoa { public string Nome { get; set; } public string Salario { get; set; } public string CorDosOlhos { get; set; } public int Idade { get; set; } public string Email { get; set; } public string Contato { get; set; } public string DataDeRegistro { get; set; } }
Eu simplesmente estou trazendo um conjunto de 100 pessoas transformando List<Pessoa>
e devolvendo o resultado.
public class HomeController : ApiController { public List<Pessoa> Get() { return JsonConvert.DeserializeObject<List<Pessoa>>(Resources.Informacao); } }
Precisamos instalar os pacotes Microsoft.AspNet.WebApi.Extensions.Compression.Server e System.Net.Http.Extensions.Compression.Client. Você precisa usar o comando Install-Package para fazer a instalação. Digite as duas linhas abaixo, uma por vez:
Install-Package Microsoft.AspNet.WebApi.Extensions.Compression.Server
Install-Package System.Net.Http.Extensions.Compression.Client
Agora com ambos os pacotes instalados, acesse o arquivo Global.asax e adicione a linha abaixo. Basicamente, estamos criando um novo MessageHandler
para aplicar a compressão GZip em todas as chamadas da WebApi.
GlobalConfiguration.Configuration .MessageHandlers .Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));
WebApiApplication
do arquivo Global.asax:public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { GlobalConfiguration.Configuration .MessageHandlers .Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor())); GlobalConfiguration.Configure(WebApiConfig.Register); } }
E se testarmos novamente nossa WebApi, o tamanho da resposta caiu cerca de 75%, para cerca de 5 KBs!