Attraverso un HttpHandler è possibile generare al volo un’immagine e restituirla al chiamante. L’immagine generata può tenere conto, ad esempio, di parametri passati nella query string, oppure di parametri della stessa richiesta, o altro ancora, e le possibili applicazioni sono infinite.
Come esempio di applicazione, supponiamo di voler visualizzare in una pagina web l’indirizzo IP di chi sta visualizzando la pagina.
L’indirizzo IP può essere facilmente ricavato dalla Request dell’HttpContext, ossia, nel CodeBehind di una pagina ASP.NET:
string ipAddress = Page.Request.UserHostAddress;
o più in generale:
string ipAddress = HttpContext.Current.Request.UserHostAddress;
Ci possono essere dei casi in cui non è possibile o è scomodo intervenire direttamente nel codice della pagina web. Ad esempio, se si volesse visualizzare l’indirizzo del chiamante in un post di questo blog o, in generale, in una pagina web HTML.
Una possibile soluzione è l’utilizzo di un HttpHandler, purché si abbia a disposizione un host raggiungibile su cui pubblicarlo. In tal caso nella pagina HTML o nel post del blog basta inserire un’immagine, con il semplice tag img:
<img src="http://imagehandlers.lucabarbi.net/VisualizeIP.ashx" alt="indirizzo IP" />
All’indirizzo indicato un HttpHandler si occuperà di recuperare l’indirizzo IP dalla Request e restituire un’immagine generata al volo con la scritta dell’indirizzo IP.
Per generare un’immagine png trasparente con la scritta dell’indirizzo IP consideriamo ad esempio il codice:
/// <summary>
/// Genera un'immagine con l'indirizzo IP del chiamante
/// </summary>
/// <param name="ipAddress"></param>
/// <returns></returns>
private Bitmap CreateImageFromIp(string ipAddress)
{
// crea l'immagine bitmap
var immagine = new Bitmap(180, 21);
// crea un oggetto grafico per disegnare
var grafico = Graphics.FromImage(immagine);
// imposta lo sfondo
var backgroundColor = Color.White;
grafico.Clear(backgroundColor);
// scrive l'ip passato
var brush = Brushes.Blue;
var font = new Font("Tahoma", 9, FontStyle.Regular);
var startPosition = new Point(2, 2);
grafico.DrawString(string.Format(
"Il tuo IP è: {0}", ipAddress), font, brush, startPosition);
// rende lo sfondo trasparente
immagine.MakeTransparent(backgroundColor);
return immagine;
}
Quindi l’HttpHandler (VisualizeIP.ashx) diventa semplicemente:
public void ProcessRequest(HttpContext context)
{
var a = HttpContext.Current.Request.UserHostAddress;
var request = context.Request;
var ipAddress = request.UserHostAddress;
var response = context.Response;
response.ContentType = "image/png";
var immagine = CreateImageFromIp(ipAddress);
immagine.Save(response.OutputStream, ImageFormat.Png);
response.Flush();
response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
Il risultato è l’immagine seguente:

In allegato i sorgenti dell'esempio: ImageHandlers.zip (15,83 kb)
Image Optimizer è una extension di Visual Studio 2010, scaricabile dalla Visual Studio Gallery, in grado di ottimizzare le immagini di tipo jpg, png e gif riducendone le dimensioni senza perdite di qualità.
Si installa anche direttamente da Visual Studio (Tools –> Extension Manager) e, una volta installata, permette di ottimizzare immagini o cartelle di immagini semplicemente cliccandoci sopra col tasto destro e selezionando Optimize image.