Realizando compactação com a compressão GZIP e Deflate no ASP .NET MVC C#

0

Recentemente, fiz um post de como realizar compactação Gzip utilizando configurações no WebConfig . Hoje vou mostrar uma maneira na qual você poderá implementar em MVC. Fazendo a compactação da controller de maneira automática, simples e fácil.

Comprimir

Comprimir

Como a compactação via controller funciona?

  1. Os navegadores que suportam a compactação ( por padrão os novos navegadores suportam a compactação) enviam ao servidor a “aceitação” de conteúdo compactado
  2. O servidor web recebe a solicitação e se prontifica de utilizar a compactação gzip
  3. Após a compactação o servidor notifica o cliente com o conteúdo .zip já pronto para ser trafegado e transferido ao cliente, todo aquele conteúdo que trafegou na controller e saiu para view.

 

Fonte: https://developers.google.com/speed/articles/gzip

 

Agora, mão a obra!

Inicialmente vamos criar trecho de código similar a este

 
 public class CompressFilterAttribute : ActionFilterAttribute
        {
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                HttpResponseBase response = filterContext.HttpContext.Response;

                if (response.Filter is GZipStream || response.Filter is DeflateStream) return;

                HttpRequestBase request = filterContext.HttpContext.Request;

                string acceptEncoding = request.Headers["Accept-Encoding"];

                if (string.IsNullOrEmpty(acceptEncoding)) return;

                acceptEncoding = acceptEncoding.ToLower();

                if (acceptEncoding.Contains("gzip"))
                {
                    response.AppendHeader("Content-encoding", "gzip");
                    response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
                }
                else if (acceptEncoding.Contains("deflate"))
                {
                    response.AppendHeader("Content-encoding", "deflate");
                    response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
                }
            }
        }
        
        

Resumidamente o que este código faz?
Bom, a classe envia o pacote de aceite ao cliente aceitando a compactação e a realiza pelo Gzip ou pelo Deflate ( que é outro método de compactação )

Agora basta adicionar o filtro de compactação na controller que você deseja compactar

 
     [CompressFilter]
    public class HomeController : Controller
    {
    }
    

Com isto você ganha mais performance!

Para uma leitura mais aprofundada, recomendo ler : https://developers.google.com/speed/articles/gzip

Obrigado a todos!

Compartilhe.