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,}(?= )|(?<= )\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,}(?= )|(?<= )\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.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Entity Framework è lento! mmmmh, probabilmente sei tu che lo stai usando male!, il 7 ottobre 2022 alle 10:55
- Cosa penso di ASP.NET vNext, il 3 settembre 2014 alle 09:00
- E così AngularJS e DurandalJS convergono..., il 7 maggio 2014 alle 11:51
- Usare fiddler per simulare le risposte da un servizio, il 28 ottobre 2013 alle 08:00
- Tip: cosa fare quando Entity Framework Code-First Migrations smette di funzionare, il 18 gennaio 2013 alle 11:04
- Visual Studio 11 beta: le novità di Entity Framework 5.0 e WCF 4.5, il 2 marzo 2012 alle 23:08