in

DotNetSide

Dot Net South Italy Developers User Group

Tips

June 2007 - Posts

  • 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.

Powered by Community Server (Commercial Edition), by Telligent Systems