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!
