WebAPI é muito popular para a construção de serviços RESTful em. NET e desempenho sempre ocupa um papel vital em qualquer aplicação. No caso de grande quantidade de dados passando pelo tráfego de rede, isto pode se tornar um problema de performance importante.
A compressão é uma boa técnica para reduzir o tamanho dos dados de resposta e aumentar a velocidade de comunicação entre um cliente e um recurso remoto.
Aqui, vamos usar DotNetZip para compactar o tamanho da resposta da nossa WebAPI.
A primeira coisa a se fazer (já considerando que você tenha seu projeto de WebAPI criado), temos que instalar a DotnetZip Library através do “gerenciador de pacotes NuGet”.
Agora, adicione uma classe chamada GzipCompression.cs, recomendo você criar uma pasta dentro do seu projeto, com o intuito de ficar mais legível, eu criei uma pasta chamada “Filters”
Escreva o código abaixo neste documento:
public class GzipCompressionAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionContext) { var content = actionContext.Response.Content; var bytes = content == null ? null : content.ReadAsByteArrayAsync().Result; var zlibbedContent = bytes == null ? new byte[0] : CompressionHelper.GzipByte(bytes); actionContext.Response.Content = new ByteArrayContent(zlibbedContent); actionContext.Response.Content.Headers.Remove("Content-Type"); actionContext.Response.Content.Headers.Add("Content-encoding", "gzip"); actionContext.Response.Content.Headers.Add("Content-Type", "application/json"); base.OnActionExecuted(actionContext); } } public class CompressionHelper { public static byte[] GzipByte(byte[] str) { if (str == null) { return null; } using (var output = new MemoryStream()) { using (var compressor = new Ionic.Zlib.GZipStream(output, Ionic.Zlib.CompressionMode.Compress, Ionic.Zlib.CompressionLevel.BestSpeed)) { compressor.Write(str, 0, str.Length); } return output.ToArray(); } } }
No código dado acima, estamos herdando a classe ActionFilterAttribute para substituir o método OnActionExecuted (com um override) e também precisamos de uma classe auxiliar para executar a compactação.
Agora, basta colocar esse atributo ActionFilter acima do método desejado em sua controller, como mostrado abaixo.
[GzipCompression] public IHttpActionResult GetEmployeeData() { List<Employee> employee = new List<Employee> { new Employee { Id = "1", Name = "Joao", Address = "Sao Paulo" }, new Employee { Id = "2", Name = "Maria", Address = "Belo Horizonte" }, new Employee { Id = "3", Name = "Jose", Address = "Manaus" }, new Employee { Id = "4", Name = "Pedro", Address = "Salvador" }, new Employee { Id = "5", Name = "Hugo", Address = "Curitiba" } }; return Ok(employee); } public class Employee { public string Id { get; set; } public string Name { get; set; } public string Address{ get; set; } }
Desta maneira fácil, podemos compactar dados de resposta e aumentar o desempenho da aplicação diminuindo a quantidade de bytes trafegados pela rede.
Você pode ler mais sobre o assunto aqui e aqui, com outros exemplos implementados.
Um grande abraço e até a próxima!