Generare un’immagine dinamicamente attraverso un HttpHandler che visualizza l’indirizzo IP

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)