Asp.Net IHttpHandler predstavený ASP.NET dve bežne používané spracovateľské rozhrania pri odpovedaní na HTTP požiadavky sú IHttpHandler a IHttpModule.
Vo všeobecnosti sa IHttpHandler používa na spracovanie špecifického typu požiadavky, ako je samostatné spracovanie každého *.asp, *.aspx súboru. IHttpModule sa zvyčajne používa na spracovanie operácií, ktoré sú bežne potrebné pre požiadavku, napríklad na vykonanie niektorých rovnakých kontrol na stránke požiadavky.
Pozrime sa na kroky spracovania IIS servera pri zadávaní príslušného HTTP požiadavky. ASP.NET má koncept pipeline, čo znamená, že každá požiadavka ASP.NET bude mať v IIS sériu zodpovedajúcich operácií na vytvorenie riadkovitej sekvencie.
ASP.NET zavedenie pipeline
Pozrime sa na časový diagram spracovania pipeline:
Ako je vidieť na obrázku, po príchode požiadavky je implementácia spracovaná HttpModule a potom sa volá metóda ProcessRequest() v HttpHandler na vytvorenie konkrétnej odpovede. Preto nie je ťažké pochopiť, prečo je spracovanie požiadaviek špecifických pre triedu umiestnené v triede HttpHandler, pričom sa vykonávajú niektoré kontroly, ktoré sú spoločné pre všetky požiadavky v HttpModule.
Prax v kóde
IHttpHandler
Autor nedávno narazil na použitie IHttpHandleru na spracovanie volaní klientského rozhrania v projekte, takže si stručne povedzme jednoduchý návrh rozhrania založený na IHttpHandler.
Rozhranie IHttpHandler má iba dvoch členov:
Atribút IsReusable identifikuje, či môže byť objekt HttpHandler použitý inými inštanciami, a zvyčajne ho nastavujeme na True. Metóda ProcessRequest() je špecifická odpoveď na požiadavku a potrebujeme sem uviesť len konkrétnu obchodnú logickú operáciu.
Najprv vytvorte nový webový projekt a pridajte triedu Handler:
Trieda RayHandler implementuje funkciu ProcessRequest() rozhrania IHttpHandler, ktorá je len priamym výstupom textu.
Potom musíme pridať nasledujúcu konfiguráciu do súboru Web.config:
path označuje zhodu URL, napríklad *.ray, čo znamená, že Handler odpovie na URL požiadavky končiace na ".ray", slovo označuje metódu požiadavky, napríklad Get/Post, a * znamená, že sa zhoduje so všetkými. typ označuje typ triedy Handler, WebApplication2. RayHandler je názov triedy, WebApplication2 označuje názov assembleru v adresári Bin, napríklad názov assembleru v príklade je WebApplication2.dll a tu nie je potrebné definovať názov prípony.
Spustite stránku, zadajte URL končiacu na ".ray" a uvidíte nasledujúci výsledok:
Prehľad IHttpHandlerFactory
Niekedy budeme musieť pracovať s viacerými rôznymi príponami, pričom jeden prípona zodpovedá triede Handler, a takto vyzerá náš súbor Web.config:
Ak máme veľa implementačných tried HttpHandler, potom konfigurácia súborov Web.config bude vyzerať rozvláčne. Alebo v niektorých prípadoch, keď vieme určiť len to, ktorý Handler reaguje počas spustenia programu, musíme použiť IHttpHandlerFactory.
IHttpHandlerFactory je definovaný nasledovne:
Medzi nimi:
GetHandler(): Vráti inštanciu, ktorá implementuje rozhranie IHttpHandler; ReleaseHandler(): Umožňuje Factory opätovne použiť existujúcu inštanciu Handlera. Ako príklad vezmime vyššie uvedené ray a rss požiadavky, implementujte triedu Factory:
V tomto prípade je konfigurácia vo Web.config nasledovná:
V tomto čase je implementovaná funkcia použitia triedy Factory na zodpovedanie rôznym špecifickým handlerom, čo zjednodušuje konfiguráciu.
Škálovateľná IHttpHandlerFactory
V uvedenej implementácii, ak program potrebuje v budúcnosti pridať novú metódu spracovania prípon, musí upraviť príkaz Switch v GetHandler(), čo môže tiež spôsobiť chyby alebo priniesť iné bezpečnostné riziká. Takže, je možné ponechať triedu HandlerFactory nezmenenú pre ďalšie rozšírenia?
Odpoveď je určite áno. Čitatelia, ktorí poznajú návrhový vzor, by mali pochopiť, že ide o jednoduchý továrenský vzor, a na dosiahnutie predchádzajúcich funkcií môžeme použiť návrhový režim nazývaný pokročilé body.
A tu môžeme tiež využiť jazykovú funkciu jazyka C# – reflexiu. Prostredníctvom reflexného mechanizmu C# odrážame zodpovedajúci Hanlderov typ podľa prípony URL, pokiaľ sa zhodujeme na zhode medzi názvom prípony URL a názvom triedy Handlera.
Napríklad prepíšeme GetHandler() nasledovne:
V tomto prípade stačí umiestniť triedu Handler do metódy pod rovnakým menným priestorom ako trieda HandlerFactory a správne ju nakonfigurovať vo Web.config. Napríklad, ak existuje trieda RayHandler, potom by sa mala pridať nasledujúca konfigurácia, ktorá automaticky zodpovedá:
súhrn Tento článok stručne predstavuje použitie IHttpHandleru v ASP.NET, poskytuje implementáciu IHttpHandlerFactory pri spracovaní viacerých požiadaviek na Handler a nakoniec zlepšuje škálovateľnú implementáciu Handleru s viacerými požiadavkami pomocou reflexného mechanizmu C#.
|