2009-04-20 9 views
76

La mia domanda è semplice (anche se la risposta probabilmente non sarà): sto cercando di decidere come implementare un gestore di upload lato server in C#/ASP.NET.IHttpHandler vs IHttpModule

Ho usato entrambi HttpModules (interfaccia IHttpModule) e HttpHandlers (interfaccia IHttpHandler) e mi viene in mente che potrei implementarlo utilizzando entrambi i meccanismi. Mi viene anche in mente che non capisco le differenze tra i due.

Quindi la mia domanda è questa: In quali casi dovrei scegliere di utilizzare IHttpHandler anziché IHttpModule (e vice/versa)?

Viene eseguito molto più in alto nella pipeline? È molto più facile da configurare in determinate situazioni? Non funziona bene con la sicurezza media?

+2

Scherzi a LOL'ed 'Essa si verifica anche a me che non capisco le differenze tra i due.' Bella domanda ma meriterebbe un +1 solo per quello :) – JohnIdol

+2

:-) Grazie. Trovo sia bello essere onesti riguardo a cose che non conosco. –

+1

Senza domande, non ci sarebbero risposte ..:) – Sprintstar

risposta

65

Un ASP.NET HTTP handler è il processo (spesso indicato come il "punto finale"), che viene eseguito in risposta a una domanda rivolta a un ASP Applicazione Web .NET. Il gestore più comune è un gestore di pagine ASP.NET che elabora i file .aspx. Quando gli utenti richiedono un file .aspx, la richiesta viene elaborata dalla pagina attraverso il gestore di pagine. Puoi creare i tuoi gestori HTTP che rendono l'output personalizzato al browser.

usi tipici per gestori HTTP personalizzati sono i seguenti:

  • feed RSS Per creare un feed RSS per un sito Web, è possibile creare un gestore che emette XML RSS-formattato. È quindi possibile associare un'estensione del nome file come .rss al gestore personalizzato. Quando gli utenti inviano una richiesta al tuo sito che termina con .rss, ASP.NET chiama il gestore per elaborare la richiesta.
  • Server immagini Se si desidera un'applicazione Web per offrire immagini di varie dimensioni, è possibile scrivere un gestore personalizzato per ridimensionare le immagini e quindi inviarle all'utente come risposta del gestore.

Un modulo HTTP è un assembly che viene chiamato su ogni richiesta che è fatto per la vostra applicazione. I moduli HTTP vengono chiamati come parte della pipeline di richieste ASP.NET e hanno accesso agli eventi del ciclo di vita durante la richiesta. I moduli HTTP consentono di esaminare le richieste in entrata e in uscita e agire in base alla richiesta.

usi tipici per i moduli HTTP sono i seguenti:

  • Sicurezza Perché è possibile esaminare le richieste in entrata, un modulo HTTP può eseguire l'autenticazione personalizzati o altri controlli di sicurezza prima che la pagina richiesta, XML Web service, o gestore è chiamato. In Internet Information Services (IIS) 7.0 in esecuzione in modalità integrata, è possibile estendere l'autenticazione dei moduli a tutti i tipi di contenuto in un'applicazione.
  • Statistiche e registrazione Poiché i moduli HTTP vengono richiamati su ogni richiesta, è possibile raccogliere le statistiche delle richieste e le informazioni del registro in un modulo centralizzato, anziché in singole pagine.
  • Intestazioni o piè di pagina personalizzati Poiché è possibile modificare la risposta in uscita, è possibile inserire contenuto come informazioni di intestazione personalizzate in ogni pagina o risposta del servizio Web XML.

Da: http://msdn.microsoft.com/en-us/library/bb398986.aspx

16

Come precisato here, HttpModules sono classi semplici che si possono collegare a pipeline di elaborazione della richiesta, considerando gestori HTTP differiscono da HttpModules non solo a causa della loro posizione nella pipeline di elaborazione della richiesta, ma anche perché devono essere mappati ad una specifica estensioni di file.

+0

non è necessario mappare un gestore a un'estensione se in un HttpModule si risolve esplicitamente in una classe che implementa iHttpHandler – rizzle

+0

@rizzle: cosa intendi con "esplicitamente risolto in una classe che implementa IHttpHandler"? Intendi che IHttpModule è anche un IHttpHandler? –

+3

@Ryan: nel modulo è possibile associare un metodo all'evento HttpApplication.BeginRequest e assegnargli il gestore scelto, indipendentemente dall'estensione del file – rizzle

13

IHttpModule ti dà molto di più di controllo, si può sostanzialmente controllare tutte del traffico diretto verso l'applicazione Web. IHttpHandler ti dà meno controllo (il traffico viene filtrato prima del raggiunge il gestore), ma se questo è sufficiente per le tue esigenze, non vedo alcun motivo per utilizzare lo IHttpModule.

In ogni caso, probabilmente è meglio avere la logica personalizzata in una classe separata, quindi utilizzare questa classe solo da IHttpModule o IHttpHandler. In questo modo non devi davvero preoccuparti di scegliere l'uno o l'altro. In effetti, è possibile creare una classe aggiuntiva che implementa siaIHttpHandler e IHttpModule e quindi decidere cosa utilizzare impostandolo in Web.config.

+0

Grazie, puoi spiegarlo un po 'per dire che stiamo aggiungendo un'autorizzazione personalizzata a un server web per dire richieste remote ma non utilizzarle per quelle locali? – fayyazkl

5

I moduli sono progettati per gestire gli eventi generati dall'applicazione prima e dopo che la richiesta è stata effettivamente elaborata dal gestore. Gli handler, d'altra parte, non hanno la possibilità di iscriversi ad alcun evento applicativo e, invece, semplicemente invocano il loro metodo ProcessRequest per il lavoro "principale" di elaborazione di una richiesta specifica.

Date un'occhiata a questa documentazione da Microsoft (circa a metà strada verso il basso la pagina nel "La richiesta viene elaborata dalla pipeline HttpApplication" sezione):

http://msdn.microsoft.com/en-us/library/bb470252.aspx

Si può vedere al punto 15 in cui il conduttore ha la possibilità di eseguire. Tutti gli eventi precedenti e successivi sono disponibili per l'intercettazione dai moduli, ma non dai gestori.

A seconda delle funzionalità specifiche che si sta tentando di raggiungere, è possibile utilizzare un gestore o un modulo per implementare un gestore di upload. Si potrebbe anche finire per utilizzare entrambi.

Qualcosa da considerare potrebbe utilizzare un gestore di upload già scritto.

Ecco un libero e open source uno:

http://www.brettle.com/neatupload

Ecco uno spot uno:

http://krystalware.com/Products/SlickUpload/

Se si guarda la documentazione per NeatUpload, vedrete che essa richiede di configurare un modulo.

5

15 secondi ha una bella piccola tutorial dando esempio pratico

+2

Questo articolo può ora essere trovato su codeguru: http://www.codeguru.com/csharp/.net/net_asp/article.php/c19389/HTTP-Handlers-and-HTTP-Modules-in-ASPNET.htm – mhu

Problemi correlati