Asp.Net IHttpHandler bemutatása ASP.NET két leggyakrabban használt feldolgozó interfész Http-kérésekre válaszoláskor az IHttpHandler és az IHttpModule.
Általánosságban az IHttpHandler egy adott típusú kérés kezelésére szolgál, például minden *.asp, *.aspx fájl külön feldolgozására. Az IHttpModule-t általában olyan műveletekre használják, amelyek általában szükségesek a kéréshez, például ugyanazok az ellenőrzések végrehajtására a kérés oldalán.
Nézzük meg az IIS szerver feldolgozási lépéseit, amikor a megfelelő HTTP kérést készítjük. ASP.NET rendelkezik a pipeline fogalmaval, ami azt jelenti, hogy minden ASP.NET kérésnek egy sor IIS művelete lesz, hogy sorszerű sorozatot alkossanak.
ASP.NET bevezetés a pipeline
Nézzük meg a csővezeték feldolgozási időzítési diagramját:
Ahogy az ábrán látható, a kérés megérkezése után a megvalósítást a HttpModule feldolgozza, majd a HttpHandler ProcessRequest() módszerét hívja a konkrét válaszhoz. Ezért nem nehéz megérteni, miért helyezik el az osztályspecifikus kérések kezelését a HttpHandler osztályba, miközben olyan ellenőrzéseket végzünk, amelyek a HttpModul minden kérésére jellemzőek.
Kódgyakorlat
IHttpHandler
A szerző nemrégiben rátalált az IHttpHandler alkalmazására a kliens interfész hívások kezelésére a projektben, ezért röviden beszéljük az IHttpHandler-en alapuló egyszerű interfésztervezést.
Az IHttpHandler felület csak két tagból áll:
Az IsReusable attribútum azonosítja, hogy a HttpHandler objektumot más példányok is használhatják-e, és általában True-ra állítjuk be. A ProcessRequest() metódus egy konkrét válasz a kérésre, és csak a konkrét üzleti logikai műveletet kell ide helyeznünk.
Először hozz létre egy új webprojektet, és adj hozzá egy Handler osztályt:
A RayHandler osztály az IHttpHandler interfén található ProcessRequest() funkcióját valósítja meg, amely egy szöveg közvetlen kimenete.
Ezután a következő konfigurációt kell hozzáadnunk a Web.config fájlba:
path URL-egyezést jelöl, például *.ray, ami azt jelenti, hogy a kezelő válaszol az ".ray" végű URL-kérvényekre, ige a kérési módszert, például Get/Post, és a * azt jelenti, hogy mindegyikhez egyezik. type jelzi a Handler osztály típusát, WebApplication2. RayHandler az osztály neve, WebApplication2 a Bin könyvtárban lévő assembly nevére utal, például a példában az assembly neve WebApplication2.dll, és itt nincs szükség szenfíznév meghatározására.
Indítsd el az oldalt, írd be az ".ray" végű URL-t, és a következő eredményt láthatod:
IHttpHandlerFactory áttekintés
Néha több különböző toldalataggal kell foglalkoznunk, az egyik toldaltag egy Handler osztálynak felel meg, és így néz ki a Web.config fájlunk:
Ha sok HttpHandler implementációs osztályunk van, akkor a Web.config fájl konfigurációja biztosan bőbeszédűnek tűnik. Vagy bizonyos esetekben, amikor csak azt tudjuk meghatározni, melyik Handler reagál a program futásakor, akkor az IHttpHandlerFactory funkciót kell használnunk.
Az IHttpHandlerFactory a következőképpen definiálható:
Közöttük:
GetHandler(): Egy példányt ad vissza, amely megvalósítja az IHttpHandler interfészt; ReleaseHandler(): Lehetővé teszi a Factory számára, hogy újrahasznosítson egy meglévő Handler példányt. Vegyük például a fenti ray és rss kéréseket, valósítsuk meg a Factory osztályt:
Ebben az esetben a Web.config konfigurációja a következő:
Ekkor megvalósítják a Factory osztály használatát különböző specifikus kezelők megfelelőjére, egyszerűsítve a konfigurációt.
Skálázható IHttpHandlerFactory
A fenti megvalósításban, ha a programnak a jövőben új sufffix kezelési módszert kell hozzáadnia, módosítania kell a GetHandler() Switch utasítását, ami hibákat okozhat vagy egyéb biztonsági kockázatokat is okozhat. Szóval, lehetséges-e a HandlerFactory osztályt változatlan megtartani a későbbi bővítéseknél?
A válasz határozottan igen. Azoknak, akik ismerik a tervezési mintát, meg kell érteniük, hogy ez egy egyszerű gyári minta, és a korábbi funkciók eléréséhez használhatjuk a fejlett pontok nevű tervezési módot.
Itt használhatjuk a C# nyelv nyelvi funkcióját is – a reflexiót. A C# visszatükrözési mechanizmusán keresztül tükrözzük a megfelelő Hanlder típust az URL utótagja szerint, amennyiben egyetértünk az URL utótag neve és a kezelő osztályneve közötti egyezésben.
Például a GetHandler()-t a következőképpen írjuk át:
Ebben az esetben csak a Handler osztályt kell a metódusban ugyanabban a névtérben behelyezni, mint a HandlerFactory osztály, és helyesen konfigurálni a Web.config-ban. Például, ha létezik RayHandler osztály, akkor a következő konfigurációt kell hozzáadni, hogy automatikusan egyezzen:
összefoglalás Ez a cikk röviden bemutatja az IHttpHandler használatát ASP.NET-ben, biztosítja az IHttpHandlerFactory megvalósítását több Handler kérés feldolgozásában, végül pedig fejleszti a C# tükröződési mechanizmusával a skálázható többkéréses Handler megvalósítást.
|