Asp.Net Uveden IHttpHandler ASP.NET dva pogosto uporabljena procesorska vmesnika pri odgovarjanju na HTTP zahteve sta IHttpHandler in IHttpModule.
Na splošno se IHttpHandler uporablja za obdelavo določene vrste zahtev, kot je ločena obdelava vsake datoteke *.asp, *.aspx. IHttpModule se običajno uporablja za izvajanje operacij, ki so običajno potrebne za zahtevo, kot je izvajanje nekaterih istih preverjanj na strani zahteve.
Poglejmo si postopke obdelave na IIS strežniku pri oddaji ustrezne HTTP zahteve. ASP.NET ima koncept cevovoda, kar pomeni, da bo vsaka ASP.NET zahteva imela niz ustreznih operacij v IIS, da tvori zaporedje, podobno liniji.
ASP.NET uvod v cevovod
Poglejmo diagram časovnega procesiranja cevovoda:
Kot je razvidno iz slike, ko zahteva prispe, implementacijo obdela HttpModule, nato pa se pokliče metoda ProcessRequest() iz HttpHandlerja za specifičen odgovor. Zato ni težko razumeti, zakaj je obravnava zahtev, specifičnih za razred, postavljena v razred HttpHandler, hkrati pa opravi nekatere preglede, ki so skupni vsem zahtevam v HttpModule.
Praksa kodiranja
IHttpHandler
Avtor je pred kratkim naletel na uporabo IHttpHandlerja za upravljanje klicev odjemalskega vmesnika v projektu, zato si na kratko ogovorimo preprosto zasnovo vmesnika, ki temelji na IHttpHandlerju.
Vmesnik IHttpHandler ima le dva člana:
Atribut IsReusable določa, ali lahko objekt HttpHandler uporabljajo tudi drugi primerki, običajno pa ga nastavimo na True. Metoda ProcessRequest() je specifičen odgovor na zahtevo, tukaj pa moramo vnesti le specifično poslovno logično operacijo.
Najprej ustvarite nov spletni projekt in dodajte razred Handler:
Razred RayHandler izvaja funkcijo ProcessRequest() vmesnika IHttpHandler, ki je le neposreden izhod besedila.
Nato moramo v datoteko Web.config dodati naslednjo konfiguracijo:
path označuje ujemanje URL-jev, kot je *.ray, kar pomeni, da bo Handler odgovoril na URL zahteve, ki se končajo na ".ray", glagol označuje način zahteva, kot je Get/Post, * pa pomeni, da se ujema z vsemi. type označuje vrsto razreda Handler, WebApplication2. RayHandler je ime razreda, WebApplication2 se nanaša na ime sestavljanja v mapi Bin, na primer, ime sestavljanja v primeru je WebApplication2.dll, in tukaj ni potrebe po definiranju imena pripone.
Zaženi stran, vnesi URL, ki se konča na ".ray", in vidiš naslednji rezultat:
Pregled IHttpHandlerFactory
Včasih se moramo ukvarjati z več različnimi priponami, ena pripona ustreza razredu Handler, in tako izgleda naša Web.config datoteka:
Če imamo veliko razredov implementacije HttpHandler, bo naša konfiguracija Web.config datotek zagotovo videti obširno. Ali pa v nekaterih primerih, ko lahko določimo le, kateri Handler odgovarja med izvajanjem programa, moramo uporabiti IHttpHandlerFactory.
IHttpHandlerFactory je definiran takole:
Med njimi:
GetHandler(): Vrne instanco, ki implementira vmesnik IHttpHandler; ReleaseHandler(): Omogoča Factory ponovno uporabo obstoječe instance Handlerja. Vzemimo zgornji žarek in rss zahteve kot primer, implementirajte razred Factory:
V tem primeru je konfiguracija v Web.config naslednja:
Takrat je implementirana funkcija uporabe razreda Factory za upodobitev različnim specifičnim handlerjem, kar poenostavi konfiguracijo.
Skalabilna IHttpHandlerFactory
V zgornji implementaciji, če bo program v prihodnosti potreboval novo metodo za upravljanje pripon, mora spremeniti ukaz Switch v GetHandler(), kar lahko prav tako povzroči napake ali prinaša druga varnostna tveganja. Torej, ali je mogoče ohraniti razred HandlerFactory nespremenjen za naslednje razširitve?
Odgovor je zagotovo da. Bralci, ki poznajo oblikovalski vzorec, bi morali razumeti, da gre za preprost tovarniški vzorec, in za dosego prejšnjih funkcij lahko uporabimo način načrtovanja, imenovan napredne točke.
In tukaj lahko uporabimo tudi jezikovno funkcijo jezika C# – refleksijo. S pomočjo refleksijskega mehanizma C# odražamo ustrezni Händrov tip glede na pripono URL-ja, dokler se strinjamo glede ustreznosti med imenom pripone URL-ja in imenom razreda Handlerja.
Na primer, GetHandler() prepišemo na naslednji način:
V tem primeru morate razred Handler le vstaviti v metodo pod isti imenski prostor kot razred HandlerFactory in ga pravilno konfigurirati v Web.config. Na primer, če obstaja razred RayHandler, je treba dodati naslednjo konfiguracijo, da se samodejno ujema:
Povzetek Ta članek na kratko predstavi uporabo IHttpHandlerja v ASP.NET, omogoča implementacijo IHttpHandlerFactory pri obdelavi več zahtevkov Handlerja in nazadnje izboljšuje razširljivo implementacijo večzahtevnega Handlerja z uporabo refleksijskega mehanizma C#.
|