Autore: Luca Barbi
Gli HTTP Handler sono dei meccanismi di ASP.NET che si occupano di elaborare le risposte a specifiche richieste HTTP e fornirle, secondo la forma più consona, al richiedente.
Questo Generic Handler restituisce un'immagine a caso tra quelle presenti in una directory di un sito web.
Si tratta di un file con estensione .ashx che non ha bisogno di essere compilato, né di essere registrato nel file web.config. Basterà solamente far riferimento ad esso come URL di un'immagine, indipendentemente da dove questo sia utilizzato.
Ad esempio, supponendo di chiamare il nostro file ImmagineCasuale.ashx e di metterlo nella root del sito web www.miosito.it, potremmo utilizzarlo per visualizzare un'immagine casuale In diversi modi.
- Attraverso un tag HTML in una pagina web
<img src="/ImmagineCasuale.ashx" alt="immagine casuale"/>
div.intestazione {
background-image: url (/ImmagineOraria.ashx);
}
- In un controllo server web ASP.NET
<asp:Image ID="ImmagineCasuale" runat="server" ImageUrl="~/ImmagineCasuale.ashx"
AlternateText="Immagine Casuale" />
E' possibile, inoltre, chiedere l'immagine casuale da un altro sito, sarà sufficiente indicare l'URL completo: http://www.miosito.it/ImmagineCasuale.ashx
Ecco il codice:
<%@ WebHandler Language="VB" Class="ImmagineCasuale" %>
Imports System
Imports System.Web
Public Class ImmagineCasuale : Implements IHttpHandler
' qui indico la directory in cui ci sono le immagini
Const DIRIMMAGINI = "immagini/fotocasuali"
' implementazione del metodo
Public Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest
' metto i nomi dei file .jpg in un array
' (potrei farlo anche per altre estensioni)
Dim nomiFileImmagine() As String = _
System.IO.Directory.GetFiles(context.Server.MapPath(DIRIMMAGINI), "*.jpg")
' se ci sono immagini ne estraggo una a caso e la invio come HttpResponse
If nomiFileImmagine.Length > 0 Then
Dim n As Integer
Dim vMax As Integer
vMax = nomiFileImmagine.GetUpperBound(0)
Randomize()
n = CInt(Int((vMax + 1) * Rnd()))
Dim response As Web.HttpResponse = context.Response
response.ContentType = "image/jpeg"
response.Cache.SetCacheability(HttpCacheability.Public)
response.BufferOutput = False
response.WriteFile(nomiFileImmagine(n))
response.End()
End If
End Sub
' poiché si tratta di sola lettura imposto IsReusable a True
Public ReadOnly Property IsReusable() As Boolean _
Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property
End Class
Un esempio di possibile utilizzo potrebbe essere un banner pubblicitario di una pagina web, in cui ad ogni richiesta lo sponsor varia casualmente.
Possibili varianti: cambiare la directory o scegliere l'immagine a seconda dei parametri passati attraverso una QueryString, oppure scegliere l'immagine a seconda dell'ora.
In quest'ultimo caso il codice potrebbe essere:
<%@ WebHandler Language="VB" Class="ImmagineOraria" %>
Imports System
Imports System.Web
Public Class ImmagineOraria : Implements IHttpHandler
Const DIRIMMAGINI = "immagini/orarie"
Public Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest
Dim nomiFileImmagine() As String = _
{"mattino", "giorno", "pomeriggio", "sera", "notte"}
Dim n, ora As Integer
ora = DateTime.Now.Hour
Select Case ora
Case 22 To 24, 0 To 6
n = 4
Case 7 To 9
n = 0
Case 17 To 19
n = 2
Case 20 To 21
n = 3
Case Else
n = 1
End Select
Dim response As Web.HttpResponse = context.Response
response.ContentType = "image/jpeg"
response.Cache.SetCacheability(HttpCacheability.Public)
response.BufferOutput = False
response.WriteFile(context.Server.MapPath(DIRIMMAGINI & _
nomiFileImmagine(n) & ".jpg"))
response.End()
End Sub
Public ReadOnly Property IsReusable() As Boolean _
Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property
End Class
In allegato una solution per VS 2005 con entrambi questi handler e due pagine html per provarli.