Asp.Net introduzione di IHttpHandler ASP.NET due interfacce di elaborazione comunemente utilizzate quando si risponde a richieste Http sono IHttpHandler e IHttpModule.
In generale, IHttpHandler viene utilizzato per gestire un tipo specifico di richiesta, come l'elaborazione separata di ogni file *.asp, *.aspx. IHttpModule viene solitamente utilizzato per gestire operazioni comunemente richieste per la richiesta, come l'esecuzione di alcuni degli stessi controlli nella pagina della richiesta.
Diamo un'occhiata ai passaggi di elaborazione del server IIS quando si effettua la richiesta HTTP corrispondente. ASP.NET ha il concetto di pipeline, il che significa che ogni richiesta ASP.NET avrà una serie di operazioni corrispondenti in IIS per formare una sequenza simile a una linea.
ASP.NET introduzione alla pipeline
Diamo un'occhiata al diagramma dei tempi di elaborazione della pipeline:
Come si può vedere dalla figura, dopo l'arrivo della richiesta, l'implementazione viene elaborata da HttpModule e poi viene chiamato il metodo ProcessRequest() di HttpHandler per fornire la risposta specifica. Pertanto, non è difficile capire perché la gestione delle richieste specifiche di classe venga inserita nella classe HttpHandler mentre si effettuano alcuni controlli comuni a tutte le richieste nell'HttpModule.
Pratica del codice
IHttpHandler
L'autore ha recentemente scoperto l'uso di IHttpHandler per gestire le chiamate dell'interfaccia client nel progetto, quindi parliamo brevemente del semplice design dell'interfaccia basato su IHttpHandler.
L'interfaccia IHttpHandler ha solo due membri:
L'attributo IsReusable identifica se l'oggetto HttpHandler può essere usato da altre istanze, e di solito lo impostiamo su True. Il metodo ProcessRequest() è una risposta specifica alla richiesta, e qui dobbiamo solo inserire l'operazione specifica di logica di business.
Per prima cosa, crea un nuovo progetto web e aggiungi una classe Handler:
La classe RayHandler implementa la funzione ProcessRequest() dell'interfaccia IHttpHandler, che è semplicemente un output diretto di un pezzo di testo.
Poi dobbiamo aggiungere la seguente configurazione nel file Web.config:
path indica il matching URL, come *.ray, che significa che il Handler risponderà alle richieste URL che terminano in ".ray", verb indica il metodo di richiesta, come Get/Post, e * significa che corrisponde a tutti. type indica il tipo di classe Handler, WebApplication2.RayHandler è il nome della classe, WebApplication2 si riferisce al nome dell'assembly nella directory Bin, ad esempio, il nome assembly nell'esempio è WebApplication2.dll, e non è necessario definire un nome suffisso qui.
Avvia il sito, inserisci l'URL che termina con ".ray" e puoi vedere il seguente risultato:
Panoramica di IHttpHandlerFactory
A volte potremmo dover gestire più suffissi diversi, uno dei quali corrisponde a una classe Handler, e questo è l'aspetto del nostro file Web.config:
Se abbiamo molte classi di implementazione HttpHandler, allora la configurazione dei file Web.config sembrerà sicuramente prola. Oppure, in alcuni casi, quando possiamo determinare quale Handler risponde solo quando il programma è in esecuzione, dobbiamo usare IHttpHandlerFactory.
IHttpHandlerFactory è definito come segue:
Tra questi:
GetHandler(): restituisce un'istanza che implementa l'interfaccia IHttpHandler; ReleaseHandler(): Permette a Factory di riutilizzare un'istanza Handler esistente. Prendiamo come esempio le richieste ray e rss sopra menzionate, implementate la classe Factory:
In questo caso, la configurazione in Web.config è la seguente:
In questo momento, viene implementata la funzione di utilizzare la classe Factory per corrispondere a diversi gestori specifici, semplificando la configurazione.
IHttpHandlerFactory scalabile
Nell'implementazione sopra, se il programma dovrà aggiungere in futuro un nuovo metodo di gestione del suffisso, deve modificare l'istruzione Switch in GetHandler(), il che può anche causare errori o comportare altri rischi di sicurezza. Quindi, è possibile mantenere la classe HandlerFactory invariata per le estensioni successive?
La risposta è sicuramente sì. I lettori che conoscono il pattern di progettazione devono capire che si tratta di un semplice pattern di fabbrica e, per ottenere le funzioni precedenti, possiamo utilizzare la modalità di progettazione chiamata advanced points.
E qui, possiamo anche usare la caratteristica linguistica del linguaggio C# - la riflessione. Attraverso il meccanismo di riflessione di C#, riflettiamo il corrispondente tipo di Hanlder secondo il suffisso dell'URL, purché concordiamo sulla corrispondenza tra il nome del suffisso dell'URL e il nome della classe del Handler.
Ad esempio, riscriviamo GetHandler() come segue:
In questo caso, basta inserire la classe Handler nel metodo sotto lo stesso namespace della classe HandlerFactory e configurarla correttamente in Web.config. Ad esempio, se esiste una classe RayHandler, allora dovrebbe essere aggiunta la seguente configurazione per corrispondere automaticamente:
sommario Questo articolo introduce brevemente l'uso di IHttpHandler in ASP.NET, fornisce l'implementazione di IHttpHandlerFactory nell'elaborazione di richieste multiple di Handler e, infine, migliora un'implementazione scalabile multi-richiesta Handler utilizzando il meccanismo di riflessione di C#.
|