Comprimindo requisições da WebAPI usando o DotNetZip

0

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!

Compartilhe.

Sobre o autor

Criador do blog Código Simples e com mais 9 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist. Atuando em funções analista, desenvolvedor, arquiteto, líder técnico e gestor de equipes. Mais informações em : http://jhonathansoares.com