|
Azt tapasztaltam, hogy sok barátom, akárcsak én, tévesen használta az IHttpModule.Init-et Application_Start alternatívaként néhány alkalmazás inicializációs művelethez. Azonban az IHttpModule.Init és a Global.asax Application_Start események természete eltérő, és az IHttpModule.Init nem használható közvetlenül az alkalmazás inicializációs folyamatának Application_Start ASP.NET helyettesítésére. Nem lehet egyszerűen arra is felvonni, hogy az Init módszert ismételten hívják arra a következtetésre, hogy ASP.NET programot újraindítottak. Ennek oka, hogy az IHttpModule.Init többször is meghívható, amikor ASP.NET kérésre válaszolnak, és ez nagyon valószínű, hogy a weboldal tényleges működése közben történik. Miért hívják többször az IHttpModule.Init-et, mert minden HttpApplication példány egyszerre csak egy kérést tud kezelni, és ASP.NET bizonyos számú párhuzamos kérést támogat, így a HttpApplication példány többször is létrejön, hogy különböző kérésekre válaszoljon, ha az egyidejű kérésekre nem elég. Minden HttpApplication példány új HttpModul-készletet hoz létre, és a létrehozás után meghívja az Init metódust. Application_Start csak az első HttpApplication objektum létrehozása után lesz meghívva, és a későbbi HttpApplication példányok nem indítják el ezt az eseményt. Úgy gondolom, hogy a HttpApplication példányok újrafelhasználása az egyik fő oka annak, hogy félreértik az IHttpModule Init módszerét, mert általában csak egy kérés van egy program hibakeresésekor, és gyakorlatilag lehetetlen ismételten végrehajtani a HttpModule Init módszerét. A tényleges weboldal futó környezetében az egyidejű kérések gyakoriak, és ha az Init módszert rosszul használják, furcsa problémákat okozhatnak a környezetben. Részletes részletekért kérjük, tekintse meg az MSDN "Áttekintése az ASP.NET alkalmazási életciklusról IIS 5.0 és 6.0 verziókhoz", amely képeket tartalmaz a cikkben is: A Refelectorral dekompilálhatja a System.Web assembly rendszerét, és elemezheti az IHttpModule.Init metódus hívási kapcsolatát. Végül a System.Web.HttpApplicationFactory.GetNormalApplicationInstance metódus kap, amely megmutatja, hogyan használják újra és hozzák létre a HttpApplication példányait. Összefoglalva, az IHttpModule.Init nem használható egyszerűen a Application_Start helyettesítőjeként. Egy viszonylag egyszerű mód, hogy egy statikus bool típusú mezőt használunk inicializációs címkéként, és a HttpModule-ban a program által előírt inicializáció után igazra állítjuk a jelölést, és legközelebb nem ismétlik meg az inicializációt. Azonban olyan kódot, mint a BeginRequest esemény regisztrálása, még mindig végrehajtani kell minden alkalommal, amikor az Init végrehajtódik, mert a HttpModule példány ebben az időben más, ha a statikus inicializációs jelölőmezőt megítéled anélkül, hogy ismételnénk a regisztrációs eseményt, furcsa problémákhoz vezethet, mint például az URL újraírása, néha végrehajtás, néha nem futva.
[Mítosz] A HttpApplication objektum Init metódus csak egyszer lesz elindítva?
Válasz: Többször is végrehajtani fogják!!!!
|