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.
Como a compactação via controller funciona?
- 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
- O servidor web recebe a solicitação e se prontifica de utilizar a compactação gzip
- 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.
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!