in

DotNetSide

Dot Net South Italy Developers User Group

Tips

HttpHandler per un'immagine casuale

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"/> 
  • In un foglio di stile
	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.

Only published comments... Jun 13 2007, 09:00 AM by DotNetSide Staff
Filed under:

Comments

 

opt.imize.it said:

HTTPHandler: Servire contenuti specifici

February 11, 2008 2:34 PM
Powered by Community Server (Commercial Edition), by Telligent Systems