Como comprimir o output de um webform programaticamente, em C#?

Quem programa para a web sabe perfeitamente que quanto mais pequeno o output de uma página mais rapidamente é efectuado o download da mesma.
Além da compressão do IIS (que compacta o pacote de dados e o browser descompacta), o objectivo é sem alterar qualquer html/xhtml, tornar uma página mais pequena. Vamos apenas cortar espaços e "quebras de linha".

De forma a tornar a utilização simples apenas é necessária a cada página, alterar a herança:
Ao invés de
public class _default : System.Web.UI.Page
colocamos
public class _default : CompressPage.

Ou em .net 2 sem code-behind simplesmente adicionar Inherits="CompressPage" ficando <%@ Page Language="C#" Inherits="CompressPage" %>

Como funciona?
Simplesmente elimina qualquer duplo espaço em branco tornando-o apenas num. Parece pouco?...

Utilizámos com bastante sucesso uma implementação semelhante no canal de cultura do sapo http://cultura.sapo.pt. O output da HP tem cerca de 17kb, isto usando UTF-8.
Ficamos com um output de cerca de 34% do original!

O tradeoff é um aumento de processamento médio de 0,005 segundos. Penso que negligenciável.

Segue a Class responsável pela compressão:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Web.UI;

public class CompressPage : System.Web.UI.Page
{

    protected override void Render(HtmlTextWriter output)
    {
        // FIRST INITIATE AN STRING WRITER
        StringWriter outputWriter = new StringWriter();       

        // GET THE UNCOMPRESSED OUTPUT
        HtmlTextWriter normalOutput = new HtmlTextWriter(outputWriter);
        base.Render(normalOutput);
        normalOutput.Close();
       

        // FINALLY WRITE IT DOWN AFTER COMPRESSION
        output.Write(RemoveSpaces (outputWriter.ToString()));
    }


    private string RemoveSpaces(string origin)
    {
        origin = Regex.Replace(origin, "\\s+", " ");
        origin = Regex.Replace(origin, "> <", "><");
        origin = Regex.Replace(origin, "javascript\"><!--", "javascript\">");
        origin = Regex.Replace(origin, "// --></script>\">", "</script>");
        return Regex.Replace(origin, "//--></script>\">", "</script>");
    }


}

 Esta implementação implica alterar a base class de todas as páginas. Simples para quem usa uma página base de controller.

Outra solução "mais limpa" seria criar um simples http handler com o mesmo tipo de processamento.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Related posts

Adicionar comentário


(Mostrar Gravatar avatar)  

  Country flag




Live preview

Setembro 5. 2010 07:28

Gravatar