Gli HTTP Handler di ASP.NET

di: Giuseppe Marchi     04 Aprile 2007

Il nostro primo HTTP Handler è stato dichiarato per gestire ogni tipo di richiesta verso il file "HelloWorld.aspx"; questo file non esiste fisicamente sul server, ma è stato "mappato" dal nostro handler. La cosa bella è la possibilità di mappare con alcuni HTTP Handler tutti i percorsi gestiti da IIS, quindi pagine web (.aspx, .html, etc…), immagini (.jpg, .gif, etc.) o il contenuto di intere directory, questo sempre ammesso che il nostro web server ci permetta di farlo. Purtroppo alcuni servizi di hosting limitano la gestione dei path solo alle estensioni più note di ASP.NET.

Se vogliamo creare un HTTP Handler personalizzato, senza doverlo inserire in un assembly specifico e senza doverlo registrare nel web.config dell'applicazione, possiamo avvalerci di un file con estensione .ashx, estensione predefinita per gli HTTP Handler generici. Tale file sarà segnato dalla direttiva iniziale "WebHandler" e conterrà una classe .NET che implementa l'interfaccia IHttpHandler (perché non è possibile creare degli handler senza ereditare da tale interfaccia).

Il nostro handler generico, che non fa altro che stampare a video una frase in formato file di testo, avrà quindi questa forma:

<%@ WebHandler Language="C#" Class="HandlerGenerico" %>

using System;
using System.Web;

public class HandlerGenerico : IHttpHandler
{
  public bool IsReusable
  {
    get { return false; }
  }

  public void ProcessRequest (HttpContext context)
  {
    context.Response.ContentType = "text/plain";
    context.Response.Write("Hello World, from HTTP Handler !");
  }
}

Un esempio più complesso

Vediamo ora, in che modo possiamo avvalerci degli HTTP Handler di ASP.NET per aggiungere delle funzionalità un po' più complesse e di grande impatto al nostro sito web.

Come esempio, possiamo creare un gestore in grado di mappare tutte le richieste HTTP a tutti i file con estensione ".jpg" presenti in una specifica directory; come funzionalità aggiunta, tali immagini verranno decorate con un testo che indica la data di creazione del file (questa tecnica di firmare le immagini è detta watermark, ed è molto utile per coprire le proprie risorse grafiche con il copyright).

Per raggiungere il nostro scopo, ci dobbiamo avvalere di alcune classi del namespace System.Drawing, in modo da permetterci di manipolare l'immagine e salvarla nello stream della risposta HTTP.

public class ImageHandler : IHttpHandler
{
  public bool IsReusable
  {
    get { return false; }
  }

  public void ProcessRequest(HttpContext context)
  {
    // prelevo informazioni su file fisico richiesto
    Bitmap b = new Bitmap(context.Request.PhysicalPath);
    FileInfo fi = new FileInfo(context.Request.PhysicalPath);
    Graphics g = Graphics.FromImage(b);

    // imposto l'allineamento della stringa da stampare (in fondo a destra)
    StringFormat format = new StringFormat();
    format.Alignment = StringAlignment.Far;
    format.LineAlignment = StringAlignment.Far;

    // disegno la stringa
    g.DrawString(fi.CreationTime.ToLongDateString(),
        new Font("Verdana", 20, FontStyle.Bold),
        Brushes.Orange,
        new Rectangle(10, 10, b.Width - 10, b.Height - 10), format);
  
    g.Dispose();

    // salvo la stringa nel buffer di risposta
    b.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    b.Dispose();
  }
}

Dopo aver inserito questo handler nella directory App_Code dell'applicazione web, lo registriamo nel web.config:

<system.web>
  <httpHandlers>
    <add type="HelloWorldHandler" verb="*" path="HelloWorld.html" />
    <add type="ImageHandler" verb="*" path="Images/*.jpg" />
  </httpHandlers>
</system.web>

In questo modo, tutte le richieste alle immagini jpeg presenti nella directory "/Images", saranno segnate con la data della loro creazione.

Conclusioni

Questa è solo una breve panoramica riguardo le tecniche disponibili per la creazione e l'utilizzo degli HTTP Handler di ASP.NET; utili implementazioni sono legate ad argomenti come l'url rewriting, il watermarking sulle immagini o semplicemente sulla realizzazione di filtri su specifiche richieste HTTP. Per un esempio di url rewriting tramite http Handler questo tutorial.

Gli HTTP Handler, inoltre, svolgono una funzione molto simile a quella che è propria dei filtri ISAPI di IIS, con la differenza che hanno la possibilità di essere gestiti direttamente all'interno dell'applicazione web prescelta, senza dover metter mano alle configurazioni del web server, cosa che non è sempre possibile in ambienti di produzione. Chiaramente, gli sviluppi possibili legati agli HTTP Handler sono veramente infiniti e dettati dall'immaginazione dello sviluppatore.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto