Minden ASP.NET oldallekérdezés, amely az IIS szervert célozza az ASP.NET HTTP csőrendszer felett kerül feldolgozásra. A HTTP csőrendszer egy kezelő objektumláncolat, amely egymás után feldolgozza a kérést, és elkészíti az átmenetet az URL-től egy HTML text válaszig. A belépési pont a HTTP csőrendszerbe a HttpRuntime osztály. Az ASP.NET infrastruktúra létrehoz egy példányt ebből az osztályból, minden kiszolgált AppDomain-hez a munkafolyamaton belül.
A HttpRuntime osztály felvesz egy HttpApplication objektumot a belső tartalékból és beállítja, hogy a kérésen dolgozzon. A HTTP alkalmazáskezelő által végrehajtott fő feladat megkeresi azt az osztályt, amely aktuálisan kezeli a kérést. Amikor a kérés egy .aspx erőforrás, akkor a kezelő egy oldalkezelő – név szerint egy példánya annak az osztálynak, amely a Page objektumból öröklődik. Az erőforrás- és kezelőtípusok közötti megfeleltetés az alkalmazás konfigurációs állományában tárolódik. Pontosabban az alapértelmezett megfeleltetés-készlet a machine.config állomány <httpHandlers> részében definiálódik. Mindamellett az alkalmazás képes testre szabni a saját HTTP kezelőjének listáját a helyi web.config fájlban. Az alábbi sor szemlélteti a kódot, amely definiálja a HTTP kezelőt az .aspx erőforráshoz.
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
Egy kiterjesztés általában kapcsolatban lehet egy vagy több kezelőosztállyal egy kezelő üzemi osztály segítségével. Minden esetben a HttpApplication objektum a felelős a kérésért, amely egy objektumot kér, amely megvalósítja az IHttpHandler interfészt. Ha a kapcsolatban álló erőforrás/osztály a HTTP kezelő szerint feloldódik, akkor a visszaadott osztály valósítja meg közvetlenül az interfészt. Ha az erőforrás egy kezelő üzemhez kötődik, akkor egy extra lépés szükséges. Egy kezelő üzemi osztály megvalósítja az IHttpHandlerFactory interfészt, amelynek a GetHandler metódusa visszaad egy IHttpHandler-alapú objektumot.
Hogyan tudja a HTTP futtatókörnyezet lezárni a körforgalmat és feldolgozni a kérést? Az IHttpHandler interfész előtérbe helyezi a ProcessRequest metódust. Meghívva ezt a metódust az objektumon, amely reprezentálja a kért lapot, az ASP.NET infrastruktúra elindítja a folyamatot, amely kimenetet generál a böngészőbe.
A valódi Page osztály
Az egyéni oldal HTTP kezelőjének típusa az URL-től függ. Először az URL-t hívja segítségül, egy új osztályt állít össze, és dinamikusan assembly-be fordítja. Az osztály forráskódja az elemző folyamat végeredménye, ami megvizsgálja az .aspx forrást. Az osztály az ASP névtér részeként definiált, és adott egy név számára, amely utánozza az eredeti URL-t. Például ha az URL célpontja a page.aspx, akkor az osztály neve ASP.Page_aspx. Az osztály neve, mindennek ellenére programozottan vezérelhető, beállítva a ClassName attribútumot a @Page direktívában.
A HTTP kezelő alaposztálya a Page. Ez az osztály definiálja a minimum metóduskészletet és tulajdonságokat, amelyek valamennyi oldalkezelő által megosztottak. A Page osztály az IHttpHandler interfészt valósítja meg.
Némely körülmények között az alaposztály az aktuális kezelőhöz nem a Page, hanem egy különálló osztály. Ilyen akkor történik, ha például mögöttes kódot használunk. A mögöttes kód egy fejlesztői technika, amely elszigeteli az oldalhoz szükséges kódot egy különálló C# vagy Visual Basic.NET osztályba. Egy oldal kódja az eseménykezelők összessége és a segítő metódusok, amelyek aktuálisan az oldal viselkedését idézik elő. Ez a kód soron belül definiálható, felhasználva a <script runat=server> tag-et, vagy elhelyezve egy külső osztályban, mögöttes kódosztályban. Egy mögöttes osztály egy olyan osztály, amely örökli a Page-et, és extra metódusokra szakosodik. Ha megadjuk, a mögöttes osztály alaposztályként használható a HTTP kezelőhöz.
Egyéb szituációban, amelyben a HTTP kezelő nem a Page-en alapszik az, amikor az alkalmazás konfigurációs állománya újradefiniálást tartalmaz a PageBaseType attribútumhoz a <pages> szakaszban.
<pages PageBaseType="Classes.MyPage, mypage" />
A PageBaseType attribútum rámutat a típusra és az assembly-re, amely a bázisosztályt tartalmazza az oldalkezelőkhöz. A Page-ből származva ez az osztály automatikusan ellátja a kezelőt egy egyedi és kiterjesztett metódus- és tulajdonságkészlettel.
A Page életciklusa
Amint a HTTP lapkezelő osztály teljesen azonosítottá válik, az ASP.NET futtatókörnyezet meghívja a kezelő ProcessRequest metódusát, hogy feldolgozza a kérést. Normális esetben nem szükséges változtatni a Page osztály által közzétett metódus megvalósításán.
Ez a megvalósítás a FrameworkInitialize metódus meghívásával indul, amely felépíti a vezérlőfát az oldalhoz. A metódus egy védett és virtuális tagja a TemplateControl osztálynak – az osztály, amelyből maga a Page származik. Bármely dinamikusan generált kezelő egy .aspx erőforráshoz felülbírálja a FrameworkInitialize-t. Ebben a metódusban a teljes vezérlőfa felépül a laphoz.
Ezután a ProcessRequest elkészíti az oldalátvitel különféle fázisait: inicializálás, áttekintési információ és visszaküldési adat betöltése, az oldal felhasználói kódjának betöltése és visszaküldött szerver-oldali események futtatása. Ezután az oldal belép a fordítási módba: a frissített nézet-státusz összeáll; a HTML kód legenerálódik és a kimeneti konzolra kerül. Végül a lap eltávolításra kerül a memóriából és a kérés teljesen kiszolgáltnak minősül.
A különféle fázisok folyamán a lap néhány eseményt indít, amelyeket Web-vezérlők és felhasználó által definiált kódok képesek elkapni és kezelni. Néhány ezek közül az események közül speciálisan beépített vezérlő és így nem kezelhető az .aspx kód szintjén.
Egy oldalnak, amely számos eseményt akar kezelni, határozottan regisztrálnia kell egy alkalmas kezelőt. Azonban a visszafelé való kompatibilitás miatt a korábbi VB programozási stílussal az ASP.NET szintén támogatja a magától értetődő eseményhurkolás egy formáját. Alapértelmezésben az oldal megpróbál megfeleltetni speciális metódusneveket eseményekkel; ha egy megfeleltetés történik, a metódust az esemény kezelőjeként tartjuk számon. Az ASP.NET speciális értelmezőt nyújt hat metódusnévhez. Ezek: Page_Init, Page_Load, Page_DataBind, Page_PreRender és Page_Unload. Ezek a metódusok kezelőként tekinthetők a megfelelő eseményekhez, amelyeket a Page osztály fejt ki. A HTTP futtatókörnyezet automatikusan beköti ezeket a metódusokat a lapesemények közé, megóvva a fejlesztőket, hogy szükséges ragasztókódot írjanak. Például a Page_Load metódus bedrótozott lesz a lap Load eseményébe, amint az alábbi kód beírásra kerül:
this.Load += new EventHandler(this.Page_Load);
A speciális nevek automatikus felismerése a @Page direktíva AutoEventWireup attribútum egy vezérelt viselkedése. Ha az attribútum false-ra áll, bármely alkalmazásnak, amely kezelni szeretne egy eseményt, közvetlenül kapcsolódnia kell a lapeseményhez. Azok a lapok, amelyek nem használnak automatikus esemény-bedrótozást, enyhe teljesítménytöbblettel kell szembenézniük. Megjegyezhetjük, hogy minden Visual Studio .NET projekt létrejöhet kikapcsolt AutoEventWireup attribútum mellett. Noha az alapértelmezett beállítás az attribútumhoz true, azt jelenti, hogy a Page_Load-féle metódusok felismerésre kerülnek, és a megfeleltetett eseményhez lesznek bekötve.
Egy lap futtatása egymás utáni fokozatokból áll, amely az alábbi táblában kerül listázásra és alkalmazásszintű eseményekkel jellemezhető és/vagy felülbíráló metódusokkal védhető.
| Szakasz |
Page esemény |
Megelőzhető metódus |
| Page inicializálás |
Init |
- |
| Nézet-státusz betöltés |
- |
LoadViewState |
| Visszaküldési adatfeldolgozás |
- |
LoadPostData metódus bármely vezérlőben, amely megvalósítja az IPostBackDataHandler interfészt |
| Page betöltés |
Load |
- |
| Visszaküldési változásértesítés |
- |
RaisePostDataChangedEvent metódus bármely vezérlőben, amely megvalósítja az IPostBackDataHandler interfészt |
| Visszaküldési eseménykezelő |
Bármely vezérlő által definiált visszaküldő esemény |
RaisePostBackEvent metódus bármely vezérlőben, amely megvalósítja az IPostBackEventHandler interfészt |
| Page előfordító fázis |
PreRender |
- |
| Nézet-státusz mentés |
- |
SaveViewState |
| Page fordítás |
- |
Render |
| Page felszabadítás |
Unload |
- |
Néhány feljebb listázott pont nem látható az oldal szintjén és csupán a szervervezérlő szerzője előtt, illetve a fejlesztő előtt látható, aki létrehoz egy osztályt a Page-ből. Init, Load, PreRender, Unload és valamennyi, a beágyazott vezérlők által definiált visszaküldött esemény csak egy jelzése az életnek, amit az oldal küld a külvilágnak.