Asp.Net IHttpHandler představen ASP.NET dvě běžně používaná zpracovatelská rozhraní při odpovídání na HTTP požadavky jsou IHttpHandler a IHttpModule.
Obecně se IHttpHandler používá ke zpracování specifického typu požadavku, například k samostatnému zpracování každého souboru *.asp, *.aspx. IHttpModule se obvykle používá k řešení operací, které jsou běžně vyžadovány pro požadavek, například k provádění některých stejných kontrol na stránce požadavku.
Podívejme se na zpracovatelské kroky IIS serveru při zadávání odpovídajícího HTTP požadavku. ASP.NET má koncept pipeline, což znamená, že každý ASP.NET požadavek bude mít v IIS řadu odpovídajících operací, které vytvářejí řádkovou sekvenci.
ASP.NET Úvod do potrubí
Podívejme se na časový diagram zpracování pipeline:
Jak je vidět na obrázku, po příchodu požadavku je implementace zpracována HttpModule a poté je vyvolána metoda ProcessRequest() v HttpHandleru, která vykonává konkrétní odpověď. Proto není těžké pochopit, proč je zpracování požadavků specifických pro třídu umístěno do třídy HttpHandler, přičemž se provádějí některé kontroly, které jsou společné pro všechny požadavky v HttpModule.
Praxe v kódování
IHttpHandler
Autor nedávno narazil na použití IHttpHandleru pro zpracování klientských volání v projektu, takže si stručně pojďme probrat jednoduchý návrh rozhraní založený na IHttpHandleru.
Rozhraní IHttpHandler má pouze dva členy:
Atribut IsReusable identifikuje, zda lze objekt HttpHandler použít i jinými instancemi, a obvykle ho nastavujeme na True. Metoda ProcessRequest() je konkrétní odpověď na požadavek a stačí zde uvést konkrétní operaci obchodní logiky.
Nejprve vytvořte nový webový projekt a přidejte třídu Handler:
Třída RayHandler implementuje funkci ProcessRequest() rozhraní IHttpHandler, která je pouze přímým výstupem textu.
Poté musíme do souboru Web.config přidat následující konfiguraci:
path označuje shodu URL, například *.ray, což znamená, že handler odpoví na URL požadavky končící na ".ray", slovo označuje metodu požadavku, například Get/Post, a * znamená, že se shoduje se všem. typ označuje typ třídy Handler, WebApplication2. RayHandler je název třídy, WebApplication2 odkazuje na název assembleru v adresáři Bin, například název assembleru v příkladu je WebApplication2.dll a zde není potřeba definovat příponu.
Spusťte web, zadejte URL končící na ".ray" a uvidíte následující výsledek:
Přehled IHttpHandlerFactory
Někdy budeme muset pracovat s více různými příponami, přičemž jeden přípona odpovídá třídě Handler, a takto vypadá náš soubor Web.config:
Pokud máme hodně implementačních tříd HttpHandler, pak naše konfigurace souboru Web.config bude působit rozvláčně. Nebo v některých případech, kdy můžeme určit pouze to, který Handler reaguje při běhu programu, musíme použít IHttpHandlerFactory.
IHttpHandlerFactory je definován následovně:
Mezi nimi:
GetHandler(): Vrací instanci, která implementuje rozhraní IHttpHandler; ReleaseHandler(): Umožňuje Factory znovu použít existující instanci Handleru. Vezměme si výše uvedené požadavky na paprsek a RSS jako příklad, implementujte třídu Factory:
V tomto případě je konfigurace ve Web.config následující:
V této fázi je implementována funkce použití třídy Factory pro odpovídající různým specifickým handlerům, což zjednodušuje konfiguraci.
Škálovatelný IHttpHandlerFactory
V uvedené implementaci, pokud program bude potřebovat v budoucnu přidat novou metodu zpracování přípon, musí upravit příkaz Switch v GetHandler(), což může také způsobovat chyby nebo přinášet další bezpečnostní rizika. Je tedy možné ponechat třídu HandlerFactory beze změny pro další rozšíření?
Odpověď je rozhodně ano. Čtenáři, kteří znají návrhový vzor, by měli pochopit, že jde o jednoduchý tovární vzor, a k dosažení předchozích funkcí můžeme použít návrhový režim nazývaný pokročilé body.
A zde můžeme také využít jazykovou funkci jazyka C# – reflexi. Prostřednictvím reflexního mechanismu C# odrážíme odpovídající typ Händera podle přípony URL, pokud se shodneme na shodě mezi příponou URL a názvem třídy Handleru.
Například přepíšeme GetHandler() následovně:
V tomto případě stačí umístit třídu Handler do metody pod stejným jmenným prostorem jako třídu HandlerFactory a správně ji nakonfigurovat ve Web.config. Například pokud existuje třída RayHandler, měla by být automaticky přidána následující konfigurace, která automaticky odpovídá:
shrnutí Tento článek stručně představuje použití IHttpHandleru v ASP.NET, poskytuje implementaci IHttpHandlerFactory při zpracování více požadavků na Handler a nakonec zlepšuje škálovatelnou implementaci více-žádového Handleru pomocí reflexního mechanismu C#.
|