As vezes nos deparamos com situações onde o html gerado é muito grande, deixando uma sensação de lentidão extrema no sistema. No entanto, algumas vezes o sistema não é lento no processamento, a lentidão está no download e renderização dos dados no browser.
Uma página que gera 3MB de Html pode demorar até 2 segundos para renderizar no browser, isso é bem aceitável, mas juntem estes 2 segundos ao tempo de processamento da página no servidor e a downloads adicionais de imagens e vídeos: este tempo pode começar a ficar inaceitável. Como o HTML é um arquivo texto, é possível comprimi-lo de forma a reduzir muitas vezes mais de 50% do seu tamanho original utilizando programas como ZIP e RAR. Isso é possível alterando alguns parâmetros no header das responses também!
Com asp.net MVC podemos utilizar um Action Filter que altera o header da response fazendo com que a mesma seja comprimida antes de ser enviada para o browser:
using System.Web;
using System.Web.Mvc;
using System.IO.Compression;public class CompressFilter : ActionFilterAttribute
{public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
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);
}
}}
Este é o código da classe CompressFilter que herda de ActionFilterAttribute . Aproveitamos o evento OnActionExecutting para comprimir o resultado de qualquer Action que esteja decorada com este ActionFilter.
Na Action :
[CompressFilter]
public ActionResult Relatorio()
{
//logic
return View();
}
Um exemplo de página sem compressão:

Agora a mesma página com compressão:




