Come specificare un HttpHandler nel web.config per applicazioni ASP.NET

Giorgio Borelli

Aggiungere gli httphandler alla propria applicazione web in asp.netGli HttpHandlers di ASP.NET consentono di elaborare una risposta a fronte di una qualsivoglia richiesta al web server (IIS). Usare gli HttpHandlers permette di personalizzare la risposta da inviare al client (il browser) non solo per una classica pagina, ma per qualsivoglia risorsa sia stata richiesta, sia questa una immagine un file pdf o un file di risorse .resx ed altro ancora.

Implementarli nella propria applicazione web offre potenzialità enormi, ed il loro uso è relativamente semplice, questi non sono altro che una implementazione dell'interfaccia IHttpHandler, in grado di prendere in carico il processo della richiesta (HttpContext) ed elaborarne una risposta, per questo a fronte di richieste diverse (pagine, risorse, immagini, etc...) è possibile implementare Handlers diversi così da fornire risposte diverse.

Lo scopo di questo articolo non è quello però di descrivere il funzionamento degli HttpHandler, ma tanto quello di vedere come aggiungerli alla nostra applicazione web tramite il web.config, andiamo a scoprire come fare.

Un Handler con estensione .ashx, viene definito come un Gestore Generico delle richieste, per specificarne uno nella nostra web application, basta aggiungerlo da visual studio nella root del progetto web, così facendo l'handler è già "referenziato" nel progetto e non bisogna far altro se non invocarlo quando necessario dalle pagine e dal codice dell'applicazione, diciamo che gli handler a livello di root sono visibili in tutto il progetto web.

Sebbene questo sia il modo più facile per procedere, ci sono casi in cui vi è la necessità di specificare Handlers che si trovano dentro la cartella App_Code di ASP.NET, o in assembly esterni. Inoltre la definizione di Handlers in librerie esterne, è un modo per aumentare notevolmente la pulizia, manutenibilità e scalabilità del codice e dell'intero progetto.

Per specificare quindi gli Handlers che non si trovano a livello di root, dobbiamo agire sul web.config, tramite il nodo httphandlers, andiamo per gradi e vediamo tutti e due i casi, Handler definito nella cartella App_Code ed Handler definito in un assembly esterno:

 

HttpHandlers in App_Code

Supponiamo quindi di voler scrivere un HttpHandler in grado di rispondere alle richieste per il nostro feed RSS, aggiungiamo il nostro http handler nella cartella App_Code col nome ad es. rss.ashx e ne definiamo il codice al suo interno. Adesso però dobbiamo dire alla nostra applicazione web che desideriamo usare quell'handler per quel tipo di richiesta, per far ciò dobbiamo specificarlo nel web.config, all'interno del nodo system.web aggiungiamo il nodo httphandlers in questo modo:

<httpHandlers>
    <add verb="*" path="rss.ashx" type="rss, App_Code" validate="false" />
</httpHandlers>

bene, tramite l'elemento add abbiamo aggiunto l'handler e gli attributi specificano quanto segue:

  • verb: indica il tipo di richiesta, che può essere http, get, post, etc... con il carattere jolly asterisco "*" le indichiamo tutte;
  • path: indica il file e/o la sua estensione per le quali l'handler deve prendere in carico le richieste;
  • type: indica il nome (comprensivo di eventuale namespace) e l'assembly dell'handler (classe) vero e proprio, siccome si trova dentro la cartella App_Code, è quest'ultima che dobbiamo indicare come assembly.

non abbiamo fatto altro che dire che il nostro assembly era la cartella App_Code. Fate attenzione poichè io ho messo direttamente il nome della classe dell'handler, ma questa può trovarsi racchiusa in un namespace che eventualmente và specificato, tipo ad es: type="MyNameSpace.MyClassHandler, App_Code".

 

HttpHandlers in Assembly (.dll) esterni

Sebbene specificare un HttpHandler nella cartella App_Code sia possibile, non è una pratica molto consigliata, vuoi per una questione di sicurezza, vuoi per una maggiore manutenibilità del progetto; ed io stesso non sono solito usarla, preferisco definirmi i miei Handlers in un progetto separato e poi specificarli nel web.config indicandone l'assembly.

Supponiamo questa volta di voler scrivere un HttpHandler per gestire le richieste alle nostre immagini, e di volerlo fare in un progetto separato che poi referenzieremo sempre tramite il web.config.

Nel nostro progetto per gli handler aggiungiamo una classe (.cs o .vb se preferite) che implementa l'interfaccia IHttpHandler, e ne scriviamo il codice necessario per la gestione delle immagini come output della risposta da fornire. Compiliamo, e se non ci sono errori dovremmo ritrovarci nella cartella bin del progetto il file .dll (dynamic link library) appena creatosi, riportante il nome stesso del progetto, che ad es. abbiamo chiamato LibHandlers. Facciamo attenzione che nella cartella bin troveremo al suo interno una o due cartelle, debug e release, a seconda della modalità di compilazione impostata, il debug usato solitamente in fase di sviluppo, e la release per il deploy, per maggiori informazioni potete guardare: Compilare in Debug o Release con Visual Studio.

Torniamo adesso sul nostro progetto web e facendo click col tasto dx sulla cartella Bin (se non c'è la creiamo a livello di root) selezioniamo la voce "Aggiungi Riferimento" e sfogliamo il file system sino a raggiungere la dll precedentemente creata. Adesso, apriamo il web.config e come prima aggiungiamo il nodo httphandlers, in questo modo:

<httpHandlers>
    <add verb="*" path="*.jpg" type="MyNameSpaceHandlers.HandImg, LibHandlers" validate="false"/>
</httpHandlers>

cosa è cambiato rispetto alla precedente specifica? Innanzi tutto abbiamo usato il carattere jolly "*" nell'attributo path seguito dall'estensione jpg, così facendo indichiamo che quell'handler deve rispondere a tutte le richieste di immagini jpg qualsiasi sia il nome del file. Nel type invece abbiamo indicato il nome della classe che definisce l'handler con il suon namespace (possono definirsi anche namespace annidati, basta separarli col punto) e nel secondo parametro mettiamo proprio il nome dell'assembly che abbiamo referenziato nella cartella bin. Basterà avviare l'applicazione per vedersi gestire come per magia le immagini dal proprio handler.

Per chi lo volesse, può approfondire la messa appunto di un HttpHandler per la gestione delle immagini in ASP.NET, cliccando sul link stesso.

Non c'è altro d'aggiungere, se non sottolineare ancora una volta che creare e specificare httpHandler tramite assembly esterni, rappresenta la soluzione migliore e più elegante tra quelle proposte.

 

Desidero infine porrè una domanda/riflessione, che come si diceva a scuola, ai più attenti non sarà di certo sfuggita, i commenti sono a vostra disposizione per le risposte, cmq è questa:

D: Come mai quando aggiungiamo un HttpHandler direttamente nella root dell'applicazione web non è obbligatorio specificarlo nel web.config?

 

Chiunque voglia aggiungere qualcosa o chiedere ulteriori chiarimenti su "Come Specificare gli HttpHandlers in ASP.NET tramite il web.config", può farlo tramite i commenti, ogni vostro contributo alla discussione sarà gradito e contribuirà ad un approfondimento dell'argomento per una crescita comune.

Categorie: ASP.NET

Tags: , , , , , , ,

Aggiungi Commento

biuquote
Loading