Asp.Net introdus IHttpHandler ASP.NET două interfețe de procesare folosite frecvent atunci când se răspunde la cereri Http sunt IHttpHandler și IHttpModule.
În general, IHttpHandler este folosit pentru a gestiona un anumit tip de cerere, cum ar fi procesarea separată a fiecărui fișier *.asp, *.aspx. IHttpModule este de obicei folosit pentru a gestiona operațiuni care sunt în mod obișnuit necesare pentru cerere, cum ar fi efectuarea unor verificări similare pe pagina de solicitare.
Să aruncăm o privire asupra pașilor de procesare ai serverului IIS atunci când se face cererea HTTP corespunzătoare. ASP.NET are conceptul de pipeline, ceea ce înseamnă că fiecare cerere ASP.NET va avea o serie de operații corespunzătoare în IIS pentru a forma o secvență asemănătoare unei linii.
ASP.NET introducere în conducte
Să aruncăm o privire la diagrama timpului de procesare a pipeline-ului:
După cum se poate vedea din figură, după ce cererea sosește, implementarea este procesată de HttpModule și apoi metoda ProcessRequest() a HttpHandler este apelată pentru a da răspunsul specific. Prin urmare, nu este greu de înțeles de ce gestionarea cererilor specifice clasei este plasată în clasa HttpHandler, în timp ce se fac unele verificări comune tuturor cererilor din HttpModule.
Practica codului
IHttpHandler
Autorul a descoperit recent utilizarea IHttpHandler pentru a gestiona apelurile interfeței clientului în proiect, așa că să discutăm pe scurt despre designul simplu al interfeței bazat pe IHttpHandler.
Interfața IHttpHandler are doar doi membri:
Atributul IsReusable identifică dacă obiectul HttpHandler poate fi folosit de alte instanțe și, de obicei, îl setăm pe True. Metoda ProcesSolicitare() este un răspuns specific la cerere și trebuie doar să punem aici operația specifică de logică de business.
Mai întâi, creează un nou proiect web și adaugă o clasă Handler:
Clasa RayHandler implementează funcția ProcessRequest() a interfeței IHttpHandler, care este doar o ieșire directă a unei bucăți de text.
Apoi trebuie să adăugăm următoarea configurație în fișierul Web.config:
path indică potrivirea URL-urilor, cum ar fi *.ray, ceea ce înseamnă că Handler-ul va răspunde la cererile URL care se termină în ".ray", verbul indică metoda de cerere, cum ar fi Get/Post, iar * înseamnă că se potrivește cu toate. type indică tipul clasei Handler, WebApplication2.RayHandler este numele clasei, WebApplication2 se referă la numele asamblării din directorul Bin, de exemplu, numele asamblării în exemplu este WebApplication2.dll, și nu este nevoie să se definească un sufix aici.
Pornește site-ul, introdu URL-ul care se termină cu ".ray" și poți vedea următorul rezultat:
Prezentare generală a fabricii IHttpHandlerFactory
Uneori poate fi nevoie să lucrăm cu mai multe sufixe diferite, unul corespunzând unei clase Handler, iar așa arată fișierul nostru Web.config:
Dacă avem multe clase de implementare HttpHandler, atunci configurația fișierelor Web.config va arăta cu siguranță detaliată. Sau, în unele cazuri, când putem determina care Handler răspunde doar când programul rulează, trebuie să folosim IHttpHandlerFactory.
IHttpHandlerFactory este definit astfel:
Printre acestea:
GetHandler(): returnează o instanță care implementează interfața IHttpHandler; ReleaseHandler(): Permite Factory să reutilizeze o instanță de Handler existentă. Luați ca exemplu cererile ray și rss de mai sus, implementați clasa Factory:
În acest caz, configurația din Web.config este următoarea:
În acest moment, funcția de a folosi clasa Factory pentru a corespunde diferiților handleri specifici este implementată, simplificând configurația.
Scalabilă IHttpHandlerFactory
În implementarea de mai sus, dacă programul trebuie să adauge în viitor o nouă metodă de gestionare a sufixului, trebuie să modifice instrucțiunea Switch din GetHandler(), ceea ce poate cauza erori sau alte riscuri de securitate. Deci, este posibil să păstrez clasa HandlerFactory neschimbată pentru extensiile ulterioare?
Răspunsul este cu siguranță da. Cititorii familiarizați cu modelul de proiectare ar trebui să înțeleagă că acesta este un model simplu de fabrică, iar pentru a atinge funcțiile anterioare putem folosi modul de proiectare numit puncte avansate.
Și aici, putem folosi și caracteristica limbajului C# - reflecția. Prin mecanismul de reflexie al lui C#, reflectăm tipul Hanlder corespunzător conform sufixului URL-ului, atâta timp cât suntem de acord asupra corespondenței dintre numele sufixului URL-ului și numele clasei handler-ului.
De exemplu, rescriem GetHandler() astfel:
În acest caz, trebuie doar să pui clasa Handler în metodă sub același spațiu de nume ca clasa HandlerFactory și să o configurezi corect în Web.config. De exemplu, dacă există o clasă RayHandler, atunci ar trebui adăugată următoarea configurație pentru a se potrivi automat:
rezumat Acest articol introduce pe scurt utilizarea IHttpHandler în ASP.NET, oferă implementarea IHttpHandlerFactory în procesarea mai multor cereri Handler și, în final, îmbunătățește o implementare scalabilă multi-solicitare Handler folosind mecanismul de reflexie C#.
|