Ridurre le dimensioni di una pagina (Atto II)

di Stefano Mostarda, in .NET,

Dopo qualche tempo riesco finalmente a rimettere mano al mio PC di casa :) e ovviamente riprendo l'esperimento relativo al mio ultimo post.
Il tutto si basa su una regular exppression che rimuove caratteri "inutili" dall'html prima che venga spedito al client.
Il primo approccio che ho utilizzato è stato l'override del metodo Render della classe Page.
protected override void Render(HtmlTextWriter writer) {
StringBuilder sb = new StringBuilder();
StringWriter stringWriter = new StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
base.Render(htmlWriter);
string html = Regex.Replace(stringWriter.ToString(), @"(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,}(?=&nbsp;)|(?<=&nbsp;)\s{2,}(?=[<])", "");
writer.Write(html);
}

Il secondo ha previsto invece l'uso del Response.Filter nel Global.asax. Creando una classe derivata da Stream e passandola alla Response.Filter, nell'evento Begin_Request, ho ottenuto lo stesso risultato. Per brevità metto solo la parte del codice relativa all'override del metodo Write della nuova classe.
public override void Write(byte[] buffer, int offset, int count) {
try {
string html = System.Text.Encoding.Default.GetString(buffer, offset, count);
sb.Append(html);
if (html.ToLower().IndexOf("</html>")!=-1){
stream.Write(
System.Text.Encoding.Default.GetBytes(Modifica(sb.ToString())),
0, html.Length);
}
}
catch (Exception ex){
stream.Write(System.Text.Encoding.UTF8.GetBytes(ex.Message),0,ex.Message.Length);
}
}

private string Modifica(string html) {
return Regex.Replace(html, @"(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,}(?=&nbsp;)|(?<=&nbsp;)\s{2,}(?=[<])", "");
}

Questo è il codice nel Global.asax.cs
protected void Application_BeginRequest(Object sender, EventArgs e){
Filtro rf = new Filtro(Context.Response.Filter);
Context.Response.Filter = rf;
}

Per una ampia spiegazione su come utilizzare il Response.Filter c'è questo bell'articolo di Andrea.
Il terzo, e ultimo, approccio ha visto l'uso di un HttpHandler insieme al Response.Filter.
public class MyHTTPHandler : IHttpHandler{
public bool IsReusable {
get {return true;}
}

void IHttpHandler.ProcessRequest(HttpContext context) {
IHttpHandler page;
page = PageParser.GetCompiledPageInstance(".", context.Server.MapPath(context.Request.Path), context);
page.ProcessRequest(context);
StreamFiltro sf = new StreamFiltro(context.Response.Filter);
context.Response.Filter = sf;
}
}

Da un punto di vista della riutilizzabilità, il terzo metodo è sicuramente il migliore poichè, si può incapsulare la logica in un assembly e riutilizzarlo in più progetti semplicemente configurando il web.config. Dal punto di vista delle performance, il primo metodo è fortemente sconsigliato poichè impiega il doppio del tempo rispetto agli altri 2. Per dare un'idea mentre con il primo approccio la pagina impiega mediamente 0.0014 secondi, con gli altri 2 ne impiega 0.0007.

E' tardi. Forse è ora che vada a dormire.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese