Alberto Casu

Parsing e Modifica dell'output stream di Asp.Net

Talvolta può rendersi necessario "trattare" l'output di una applicazione asp.net che non si vuole modificare o, come nel mio caso, di un'applicazione sviluppata da terzi e di cui non si hanno i sorgenti; esempi posono essere l'aggiunta di un footer a tutte le pagine, di tag nell'header, esigenze di highlighting, o come nel mi caso dove l'esigenza era la modifica della modalità secondo la quale vennivano creati tutti gli hyperlink presenti nella pagina, al fine di rimuovere l'eventuale presenza di token di sessione che il sistema automaticamente aggiungeva nella GET (questi parametri infatti penalizzano particolarmente la creazione di siti con requisiti di posizionamento nei motori di ricerca.)

Cercando la tematica nel web, avevo trovato un post di Dino Esposito il quale introduceva ad una possibile strada, la quale leggendo nei commenti, presentava pro e contro.

Ho trovato un buono spunto nel seguente articolo il quale spiega in maniera abbastanza dettagliata la modalità.

Essenzialmente la logica è quella di inserirsi nella pipeline .net tramite un modulo o un handler, andando ad assegnare un filtro all'oggetto Response del contesto attuale; infatti l'oggetto response presente nel context presenta uno stream in "write-only", e quindi rende impossibile accedervi e modificarlo.

In maniera più pratica, nel caso di modulo, è necessario intercettare l'evento context_BeginRequest:

public class AuthRemoveModule : IHttpModule
{

    public void Init(HttpApplication context)
    {
        context.BeginRequest += new EventHandler (context_BeginRequest);
    }

    void context_BeginRequest(object sender, EventArgs e)
    {
        HttpContext context = ((HttpApplication)sender).Context;
        context.Response.Filter = new Filter(context.Response.Filter); 
    }

}

Nel caso invece di un handler, nel mio caso ho ereditato da System.Web.UI.PageHandlerFactory ed ho fatto l'override del metodo GetHandler

public class AuthRemoveHandler : System.Web.UI.PageHandlerFactory
{
    public override IHttpHandler GetHandler(HttpContext context, string
             requestType, string virtualPath, string path)
    {
        IHttpHandler handler;
        handler = base.GetHandler(context, requestType, virtualPath, path);
        context.Response.Filter = new Filter(context.Response.Filter);
        return handler;
    }

}

In entrambi i casi è stato impostato un filter, che per mia comodità è in una classe dello stesso namespace, il quale si occupa di fare l'override del metodo write.
Ogni qual volta un controllo della pagina effettuerà una write nell'oggetto response del contesto, verrà attivato il filtro affinchè ne faccia le sue opportune elaborazioni. 

Sostanzialmente, la classe si occupa di salvare in uno stream privato l'output del contesto, in quanto le operazioni di write possono essere più di una. Unica attenzione riguarda la verifica che l'output sia alla sua fine prima di procedere all'elaborazione del testo; in questa implementazione semplificata, banalmente si attende che sia stato scritto il tag </html>

internal class Filter : Stream
 {
     private Stream _inner;
     private StreamBuilter _toParse = new StreamBuilder (1024);
     internal Filter(Stream inner)
     {
         _inner = inner;
     }
     public override void Write(byte[] buffer, int offset, int count)
     {

         // Salvo la scrittura nello stream privato.
         String piece = Encoding.UTF8.GetString(buffer, offset, count);
         _toParse.Append(piece);

         // Verifico che sia stato già scritto il tag </html>
         // Altrimenti esco

         if (!Regex.IsMatch(piece, "</html>", RegexOptions.IgnoreCase))
             return;

         // Eseguo il match per rimuovere il link
         // es, cerco:
         //
auth=QvVB60r%2flnEijA2zEon1SldDD2crcE4QQgFuM7WU%2biA%3d

         String result = Regex.Replace(_toParse.ToString(),
           @"auth\=[A-Za-z0-9%]*%[3][d]",
           new MatchEvaluator(RemoveFullSegment), RegexOptions.IgnoreCase);
         Byte[] all = Encoding.UTF8.GetBytes(result);
         _inner.Write(all, 0, all.GetLength(0));

     }

     private String RemoveFullSegment(Match match)
     {
         // Modifico il match come voglio o rimuovo tutto come nel mio caso
         return "";
     }

     public override void Flush()
     {         _inner.Flush();     } 
     public override long Seek(long offset, SeekOrigin origin)
     {         return _inner.Seek(offset, origin);     } 
     public override void SetLength(long value)
     {         _inner.SetLength(value);     } 
     public override int Read(byte[] buffer, int offset, int count)
     {         return _inner.Read(buffer, offset, count);     }

}

In questa maniera è possibile controllare le modalità di rendering della pagina.

Manca all'appello solo il pezzettorelativo alla configurazione del web.config
Il modulo e l'handler sono da utilizzare alternativamente.
Ovviamente il primo va a lavorare solo sulle pagine aspx. Il secondo va a lavorare su tutte le richieste che vengono processate dal runtime .net (ad esempio allegati o altri contenuti che vengono gestiti direttamente dal framework, come ad esempio fanno WSS e MOSS)

<system.web>
   <httpHandlers>
      <add verb="*" path="*.aspx"
             type="Alberto.Internet.AuthRemoveHandler"
             validate
="false"/>
   </httpHandlers>
   <httpModules>
      <add name="AuthRemoveModule"
        type="Alberto.Internet.AuthRemoveModule"/>
  
</httpModules>
</system.web>


 

Posted: ott 17 2007, 11.37 by Teddy076 | with 1 comment(s)
Filed under:
Microsoft Office Compatibility Pack for Word, Excel, and PowerPoint 2007 File Formats v2

Segnalo il rilascio di questo pacchetto che, dopo il primo rilasci l'anno scorso con la beta (segnalato anche da igor), è ora stato rilasciato ufficialmente.

Questo aggiornamento faciliterà non poco migrazioni alla nuova versione di office nelle aziende, facendo si che si possano introdurre soluzione avanzate ad alcuni utenti (con office 2007 + WSS) Facendo si che il resto dell'azienda non sia costretta a migrare e possa continuare ad usare la stessa versione di office.

http://www.microsoft.com/downloads/details.aspx?FamilyID=941b3470-3ae9-4aee-8f43-c6bb74cd1466&displaylang=en

Posted: apr 29 2007, 11.47 by Teddy076 | with no comments
Filed under:
Sql 2005 Reporting Service e autenticazione via form

Stiamo in questi giorni migrando una applicazione di un nostro cliente ad una nuova infrastruttura HW (dopo 5 anni di sudato lavoro i due server HP: LP2000r e TC4100, andranno in pensione, al loro posto due nuovissimi DL360 G5 Xeon 5160). Con l'occasione abbiamo previsto la migrazione del relativo modulo di reporting che avevamo implementato con Sql 2000 reporting service alla versione 2005. Il modulo prevede l'utilizzo di RS con form autentication e la definizione di un'interfaccia custom di selezione dei report e dei relativi parametri di filtro.

L'impostazione di base della nuova versione è sicuramente migliore, nella versione precedente si doveva sempre lavorare molto con i vari parametri di querystring da passare al webservice che di default si trova sotto /reportserver/. I nuovi controlli che sono già disponibili in visualstudio2005, permettono di inserire un controllo sia in un'applicazione web che winform con una semplicità estrema; fino a qui... tutto bene.

C'è una cosa però che mi spiego: nella versione winform (Microsoft.ReportViewer.WinForms) del controllo esiste un bellissimo metodo per effettuare l'autenticazione del report in maniera trasparente per l'utente
ReportViewer1.ServerReport.ReportServerCredentials.SetFormsCredentials(null, "UserName", "Password", "DomainName");

La stesso metodo però, non è disponibile se si usa l'oggetto ServerReport del namespace Microsoft.ReportViewer.WebForms.

Per ovviare a questa mancanza e autenticare trasparentemente l'utente, esistono degli esempi (pazzeschi come logica) dove la pagina web che esegue il reportviewer, ricevuta una richiesta di report, si deve connette al webservice del reportserver, effettuare l'autenticazione e recuperare il cookie relativo all'autenticazione ricevuto dal webservice; deve infine impostarlo nella response della pagina, inoltrandolo quindi al client chiamante (il browser dell'utente) in modo che i succssivi accessi (che sono diretti) riutilizzino le stesse credenziali per ai dati. Ma io mi dico, non potevano metterci a disposizione lo stesso metodo SetFormsCredentials del winform??

Per chi fosse interessato, un articolo di esempio per questa tecnica date una lettura a questo post: http://blogs.msdn.com/bimusings/archive/2005/11/04/489100.aspx

Riporto inoltre qualche altro puntatore a tema interessante:
http://msdn2.microsoft.com/it-it/library/microsoft.reporting.webforms.ireportservercredentials(VS.80).aspx
http://www.gotreportviewer.com/
http://www.devx.com/dotnet/Article/30424

Posted: mar 07 2007, 12.12 by Teddy076 | with no comments
Filed under:
Monitor e Produttività

Come sviluppate? Usate un unico monitor?
Un collega qualche tempo fa mi ha inviato qualche link su ricerche effettuate che dimostrerebber l'aumento di efficienza che si ottiene lavorando con monitor multipli. Questo aumento, secondo alcuni, può andare dal 9% al 50%, a seconda della tipologia di lavoro o attività.

Personalmente, da quanto ho attaccato un crt al mio portatile (che era rimasto inutilizzato in ufficio) non ne posso fare più a meno.
Voi cosa ne pensate? Se vi va, usate i commenti.

Riporto qualche riferimento:

 

Inoltre recentemente ho visto su un post questo:

workspace

SharePoint Pro Online - LIVE (a free virtual 1-day conference)

Segnalo una conferenza per chi vuole sviluppare su WSS e per gli IT PROS. Interessante anche il formato LIVE e free.

» SharePoint Pro Live - Agenda & Registration

Source: SharePoint Pro Online - LIVE (a free virtual 1-day conference)

Posted: feb 24 2007, 02.15 by Teddy076 | with no comments
Filed under:
[OT] Italia.it ... Proprio una bella Italia

Leggo questo post di Matteo (del quale condivido tutti i commenti) e mi dico: "hanno proprio dovuto aspettare che il governo cadesse per pubblicare sta roba!??!"

Vado su chi siamo, e trovo questa AGGHIACCIANTE pagina... molto leggibile, vero??? Ma è così difficile fare un portale funzionante con 45 MILIONI di Euro??

Per fortuna nomi e cognomi sono proprio li riportati; la pagina è questa:

Sharepoint debug

In un post di Andrew Connell una soluzione per semplificare il processo di debug di WSS o MOSS (che tipicamente può risultare un po' macchinoso dovendosi attaccare al processo in esecuzione), utilizzando AttachToProcess:
http://andrewconnell.com/blog/archive/2007/01/25/5855.aspx

Leggendolo è banale, ma non sempre ci semplifichiamo la vita nello sviluppare

Posted: feb 04 2007, 10.08 by Teddy076 | with no comments
Filed under:
Tag Cloud for WSS and MOSS 2007

Durante il weekend ho scambiato qualche email con Romeo riguardo un possibile progetto che penso implementeremo con WSS, e per il quale lui si è concesso a supporto validativo della soluzione (Romeo: scherzo ;-)

Nei ragionamentimi ha proposto l'adozione del Tag Cloud per la catalogazione delle informazioni.
Sebbene utilizzo community server e bloggo quò e la, non sapevo cosa la parola "Tag Cloud" volesse dire; in pratica lo uso quotidianamente, spesso però non si conoscono i termini veri delle metodologie/tecnologie che si utilizzano. Per chi non lo sapesse: http://en.wikipedia.org/wiki/Tag_cloud

Venendo al sodo, via Bil Simser in questo suo post ho trovato questa implementazione dei Tag Cloud per WSS e MOSS.

Questo il link diretto: http://wsssearch.com/tagging.html

Posted: dic 04 2006, 01.30 by Teddy076 | with 1 comment(s)
Filed under:
Far convivere IE6 e IE7
Via [Matteo Casati]

Come testare le applicazioni web con entrambi i browser (nessuno ne ha bisogno, vero? ;)
http://blogs.aspitalia.com/matteo/post1866/IE6-IE7-Singola-Macchina.aspx
Windows SharePoint Services 3.0 Italiano
C'è voluto un po', ma finalmente anche la versione italiana è stata rilasciata....
http://www.microsoft.com/downloads/details.aspx?displaylang=it&FamilyID=D51730B5-48FC-4CA2-B454-8DC2CAF93951
Posted: dic 01 2006, 04.24 by Teddy076 | with no comments
Filed under:
Go! tutti quanti di I-Blog

Dove ci porteranno tutti questi tormentoni?!?!? :-)

[OT] Tecnologia Attuale e Nuova

Sono questi giorni di continui annunci di rilasci delle varie RTM, praticamente di tutte le nuove tecnologie MS.

Una mattina della settimana scorsa, ho preso la metropolitana a Barcellona; ho avuto dei problemi con il biglietto settimanale il quale risultava illeggibille.

Sono bastati 5 secondi di espressioni a motti tra me che parlo inglese ma non spagnolo, ed il "casellante" (da noi si chiama così :) che parlava solo spagnolo, affinchè lui (con il mio biglietto probabilmente smagnetizzato) riuscisse a riconoscerlo tramite la sua console di verifica e riuscisse comunque a rigenerare un nuovo biglietto con le 9 delle 10 corse che avevo ancora disponibili.

Tecnologia: carta (unico difetto penso non fosse riciclata...) banda magnetica, "gate" di accesso mediamente alti per assicurare l'obliterazione (tutti pagano :) -> Servizio fantastico.

Una volta uscito, prendo il metrò, (una volta vista questa, ho deciso che a Roma e Milano da ora in poi le chiamerò diversamente), l'autista ad un incrocio che ci teneva fermi da più di un minuto, estrae un telecomando e fa scattare il verde per se (dando quindi priorità al trasporto pubblico)

Tecnologia: radiocomando per il controllo remoto (mi pare sia qualche anno sia in giro come tecnologia...) e un sistema integrato dei semafori (su quello sono d'accordo che un minimo in più di intelligenza ci va... magari le centraline montano CE :-D )

Tutto ciò per dire cosa: stanno uscendo tonellate di nuove tecnologie fantastiche, che sicuramente semplificheranno la vita di noi sviluppatori e dei nostri clienti; una considerazione della sera (più per me per ricordarmelo): esistono già molte tecnologie, che se utilizzate propriamente potrebbero già semplificare la vita di tutti noi e dei nostri clienti: il tutto sta nel selezionarla correttamente.

Architettura del SW: IoC and DI

Interessante articolo su Architettura del software utilizzando Inversion of Control e Dependency Injection.

http://msdn2.microsoft.com/en-us/library/aa973811.aspx

Via: Marco De Sanctis

Posted: nov 14 2006, 12.09 by Teddy076 | with no comments
Filed under:
WSS, MOSS e Accessibilità

Gironzolando fra le varie sessioni riguardo la nuova versione di sharepoint, mi è rimasta una risposta ufficiale non risposta: il nuovo sharepoint è accessibile o no?.

Da quanto mi ha confermato Patrick Tisseghem e alcune persone responsabili di curare l'accessibilità in Microsoft, mi sono fatto l'idea che questa versione ancora non aderisce a tutti i requirements per l'accessibilità comunquemente accettati: parlo di WCAG, Section 508 e quindi legge stanca per noi che siamo in Italia; inoltre supporta solo l' HTML 4.01 e non l'XHTML 1.0 Strict.

L'eloquente risposta di Patrick è stata: "Per fotuna io non lavoro molto in italia, mi spiace per te ;)" mentre la referente MS per l'accessibilità (di cui purtroppo non ho preso nota del nome) mi ha confermato che stanno lavorando strettamente con il team di Office per far si che l'adesione a queste norme venga migliorata.

Dal mio punto di vista, mi verrebbe da affermare che i due prodotti, salvo customizzazioni non indifferenti su tutto, non possono essere utilizzati nella pubblica amministrazione italiana e nelle scuole; cosa che è un peccato perchè il prodotto è veramente veramente valido.

Lodevole comunque che al teched ci fosse uno stand intero dedicato all'accessibilità, segno dell'impegno dell'azienda sul tema: speriamo che questo si contretizzi anche sull'evoluzione di questa piattaforma.

I commenti sono aperti, se qualcuno volesse contraddirmi: sarei io il primo ad esserne felice ;)

Alberto

 

Teched - rientro e post solo su thinkmobile :(

Sono rientrato ieri sera dal teched (Sufficientemente sfinito). Alla fine non ho avuto il tempo che avrei voluto (tra sessioni, incontri e iniziative) per postare qualche dettaglio ulteriore.

Lascio però qualche riferimento ad alcuni post sul mio blog su thinkmobile.it che magari possono essere di interesse:

Alberto

 

More Posts Next page »