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

2 pagine in totale: [1] 2 Avanti >>

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 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.
wenzo scrive:
Modificare l'output di ASP.NET utilizzando Response.Filter

Ho utilizzato con successo quanto spiegato nello script in oggetto.Ora, però, vorrei inserire qualche altra cosa oltre un'immagine in testa, come ad ...
mercoledì 30 aprile 2008 | 3 risposte

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TUTORIALS
TOP TEN ARTICOLI
NOTIFICHE

Iscriviti alla nostra newsletter nuoviarticoli per ricevere e-mail le notifiche!

Indirizzo e-mail:
PROVIDER ASP.NET 2.0

Seleziona il database per avere il web.config pronto per Membership, Roles e Profile API.



IN EVIDENZA
MISC