Redazione
a- a+

Download con ASP.NET e HTTPHandler

Vediamo cosa sono e come funzionano gli HTTP Handler. Codici ed esempi.

Gli HTTP Handler sono alcuni dei meccanismi alla base dell’architettura di ASP.NET. Servono a elaborare le risposte a specifiche richieste HTTP e fornirle, secondo la forma più consona, al richiedente.

Un HTTP Handler non è altro che una classe .NET che implementa l’interfaccia IHttpHandler (reperibile sotto il namespace System.Web). Tale interfaccia espone un metodo utile a processare la richiesta HTTP in entrata (il metodo ProcessRequest) e una proprietà, di tipo boolean,  che serve a decidere se l’istanza dell’HTTP Handler corrente può essere utilizzata o meno da altre richieste (la proprietà IsReusable). Chiaramente, è proprio attraverso l’implementazione di questa interfaccia che noi possiamo sviluppare gli handler utili a svolgere le funzionalità custom di cui abbiamo bisogno.

Per creare un semplice gestore HTTP personalizzato si imposta un riferimento all’assembly System.Web.dll e si aggiunge la seguente istruzione nel codice della classe:

using System.Xml;

Infine usiamo la proprietà IsReusable e il metodo ProcessRequest dell’interfaccia IHttpHandler.

public bool IsReusable
{
   get {return false;}
}
public void ProcessRequest(HttpContext context)
{
   context.Response.Write("Ciao Mondo.");
}

Questo che abbiamo appena scritto è un semplice esempio di uso degli HTTP Handler. Ora proviamo a usarli invece per qualcosa di più utile e leggermente complesso: usare gli HTTP Handler per gestire il download di file.

Prima di tutto bisogna creare un handler che implementi il download lato client. Per questo basterebbe una pagina .aspx, ma utilizzare una intera pagina per un solo download di file alla volta è uno spreco di risorse e un carico eccessivo. Meglio un file .ashx che evita l’inutile sovraccarico che invece si avrebbe con le pagine .aspx.

Il nostro codice della pagina .ashx sarà il seguente:

using System;
using System.Web;

public class Download : IHttpHandler
{ 
   public void ProcessRequest(HttpContext context)
   {
      // codice per il download
   }
   public bool IsReusable
   {
      get { return true; }
   }
}

A questo punto dal momento che il nostro “handler” è stato creato, dobbiamo aggiungere il codice necessario per realizzare il download:

public void ProcessRequest(HttpContext context)
{

	// Identific ail noem del file dal QueryString
        string queryFile = context.Request.QueryString["file"];

     // Controllo che il nome del file sia stato passato correttamente
     if (string.IsNullOrEmpty(queryFile))
         throw new FileNotFoundException();

    // Trova il path fisico del file
    string file = Path.Combine(context.Server.MapPath("~/Files"), queryFile);

    // Controlliamo che il file esista fisicamente sul server
    if (!File.Exists(file))
      throw new FileNotFoundException();

    // ContentType di tipo immagine (jpeg)
    context.Response.ContentType = "image/jpeg";

    context.Response.AddHeader("content-disposition", "attachment;filename=" + queryFile);

    // Download il file al Client
    context.Response.WriteFile(file);

}

Con questo semplice codice abbiamo implementato un gestore di download di file immagine (in questo caso file jpg), ma nulla vieta di generalizzarlo per qualsiasi tipo di file.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Redazione
Ti interessano altri articoli su questo argomento?
Chiedi alla nostra Redazione!