|
Leidsin, et paljud sõbrad, nagu mina, kasutasid ekslikult IHttpModule.Init'i Application_Start alternatiivina rakenduste initsialiseerimise operatsioonide tegemiseks. Kuid IHttpModule.Init ja Global.asax Application_Start sündmuste olemus on erinev ning IHttpModule.Init ei saa otseselt kasutada rakenduse initsialiseerimise Application_Start ASP.NET asendamiseks. Samuti ei saa seda lihtsalt kasutada järeldamaks, et Init meetodit kutsutakse korduvalt järeldusele, et ASP.NET programm on taaskäivitatud. Põhjus on selles, et IHttpModule.Init võib ASP.NET päringule vastamisel kutsuda mitu korda ning see on väga tõenäoline, et see toimub veebisaidi tegeliku töö käigus. Miks kutsutakse IHttpModule.Init mitu korda, sest iga HttpApplication instants suudab korraga hallata ainult ühte päringut ning ASP.NET toetab teatud arvu samaaegseid päringuid, seega luuakse HttpApplication instants mitu korda, et vastata erinevatele päringutele, kui see ei ole piisav samaaegsetele päringutele vastamiseks. Iga HttpApplication eksemplar loob uue komplekti HttpModule'e ja kutsub pärast loomist Init meetodit. Application_Start kutsutakse välja alles pärast esimese HttpApplication objekti loomist ning järgnevad HttpApplication instantsid seda sündmust ei käivita. Arvan, et HttpApplication instantside taaskasutamine on peamine põhjus, miks IHttpModule'i Init meetodi kasutamine valesti mõistetakse, sest tavaliselt on meil programmi silumisel ainult üks päring ning HttpModule'i Init meetodit on põhimõtteliselt võimatu korduvalt käivitada. Tegelikus veebilehe jooksukeskkonnas on samaaegsed päringud tavalised ning kui Init meetodit valesti kasutatakse, võib see tekitada kummalisi probleeme tegelikus keskkonnas. Täpsemate detailide saamiseks vaadake MSDN-i artiklit "ASP.NET rakenduse elutsükli ülevaade IIS 5.0 ja 6.0 jaoks", mis sisaldab artiklis pilte: Saad kasutada ka Refelectorit System.Web assamblee dekompileerimiseks ja IHttpModule.Init meetodi kutse seose analüüsimiseks. Lõpuks saad meetodi System.Web.HttpApplicationFactory.GetNormalApplicationInstance, mis näitab, kuidas HttpApplication eksemplare taaskasutatakse ja luuakse. Kokkuvõttes ei saa IHttpModule.Init lihtsalt kasutada Application_Start asendajana. Suhteliselt lihtne viis on kasutada staatilist bool-tüüpi välja initsialiseerimismärgisena, määrata märgiks tõene pärast programmi nõutavat initsialiseerimist HttpModule'is, ning mitte korrata initsialiseerimist järgmisel korral. Kuid kood, nagu BeginRequest sündmuse registreerimine, tuleb ikkagi täita iga kord, kui Init käivitatakse, sest HttpModule instants on sel ajal erinev; kui hinnata staatilist inisialiseerimise märgistusvälja ilma registreerimissündmust kordamata, võib see põhjustada kummalisi probleeme, nagu URL-i ümberkirjutamine, mis mõnikord täidetakse ja mõnikord mitte.
[Müüt] Kas HttpApplication objekti Init meetod käivitatakse ainult korra?
Vastus: Seda täidetakse mitu korda!!!!
|