Modificare l'output di ASP.NET utilizzando Response.Filter

di Andrea Zani, in ASP.NET,

Come ben spiegato in questo articolo della KB sul sito di supporto di Microsoft è possibile "catturare" il codice prodotto da una nostra pagina ASP.NET per poterlo memorizzare su file, cosa molto utile perchè potremmo memorizzare il contenuto in un file e lasciare che sia questo ad essere richiamato dagli utenti, per poterlo inviare direttamente via e-mail. Grazie a questa tecnica, possiamo modificare anche questo codice per altre esigenze particolari.

Principi di filtro

Riprendendo, e modificando opportunamente, il codice presente nell'articolo appena citato, proviamo ad avere a disposizione il codice completo di una nostra pagina ASP.NET, scrivendo questo codice:

using System;
using System.Text;
using System.IO;
using System.Web;
using System.Collections;
using System.Diagnostics;

namespace ResponseFilters
  {
  public class ModificaHtml : Stream
  {
   private Stream _sink;
   private long _position;
   private StringBuilder buf;
   public ModificaHtml(Stream sink) 
   {
     _sink = sink;
     buf=new StringBuilder();
   }

   // Membri di Stream di cui fare l'override.
   public override bool CanRead {get { return true; }}
   public override bool CanSeek {get { return true; }}
   public override bool CanWrite {get { return true; }}
   public override long Length {get { return 0; }}
   public override long Position {get { return _position; } set { _position = value; }}

   public override long Seek(long offset, System.IO.SeekOrigin direction)
   {
     return _sink.Seek(offset, direction);
   }
   public override void SetLength(long length)
   {
     _sink.SetLength(length);
   }
   public override void Close()
   {
     _sink.Close();
   }
   public override void Flush()
   {
     _sink.Flush();
   }
   public override int Read(byte[] buffer, int offset, int count)
   {
     return _sink.Read(buffer, offset, count);
   }
   // Il metodo Write effettua il filtro.
   public override void Write(byte[] buffer, int offset, int count)
   {
     try
     {
      string testo=System.Text.Encoding.Default.GetString(buffer,offset,count);
      buf.Append(testo);
      if (testo.ToLower().IndexOf("</html>")!=-1)
      {
        // Invio il codice alla pagina dopo averlo modificato
        // richiamando la funzione "Modifica".
        _sink.Write(
        System.Text.Encoding.Default.GetBytes(Modifica(buf.ToString())),
        0,testo.Length);
      }
     }
     catch (Exception ex)
     {
      _sink.Write(System.Text.Encoding.UTF8.GetBytes(ex.Message),0,ex.Message.Length);
     }
   }
  }
}

Leggendo il codice, possiamo vedere che si è dovuto creare una classe che eredita dalla classe Stream, nella quale andremo a sovrascrivere proprietà e metodi per poter accedere completamente al codice contenuto nella pagina. Quindi, per poter fare in modo che il codice della nostra pagina possa essere elaborato dal codice, dobbiamo scrivere:

 ResponseFilters.ModificaHtml rf= new ResponseFilters.ModificaHtml(Response.Filter);
 Response.Filter = rf;

Nella prima riga di codice creiamo una nuova istanza alla classe creata, quindi essa viene assegnata alla proprietà "filter" di Response.

A differenza del codice presente nell'articolo della KB, possiamo vedere due modifiche. La prima è l'uso di uno StringBuilder per memorizzare il contenuto della pagina, cosa dovuta dal fatto che il contenuto della pagina viene sì inviato completamente alla classe creata, ma possono esistere dei casi in cui esso viene suddiviso in più blocchi. Questi "casi" avvengono quando all'interno della nostra pagina utilizziamo metodi della classe HttpResponse, come:

Response.WriteFile(nomefile)
 Response.Write()

La seconda modifica è presente nell'invio del codice della pagina che viene prima processato dalla funzione Modifica . In questa funzione, che possiamo personalizzare completamente, possiamo elaborare a nostra discrezione il codice HTML per modifiche e quant'altro.

2 pagine in totale: 1 2

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

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.

Approfondimenti