|
Pastebėjau, kad daugelis draugų, kaip ir aš, klaidingai naudojo IHttpModule.Init kaip Application_Start alternatyvą kai kurioms programų inicijavimo operacijoms atlikti. Tačiau Application_Start įvykių pobūdis IHttpModule.Init ir Global.asax skiriasi, o IHttpModule.Init negali būti naudojamas tiesiogiai pakeisti Application_Start ASP.NET programos inicijavimo procesą. Taip pat negalima paprasčiausiai daryti išvadą, kad Init metodas yra pakartotinai naudojamas išvadai, kad ASP.NET programa buvo paleista iš naujo. Priežastis ta, kad IHttpModule.Init gali būti iškviestas kelis kartus atsakant į užklausos ASP.NET, ir labai tikėtina, kad tai įvyks faktinio svetainės veikimo metu. Kodėl IHttpModule.Init iškviečiamas kelis kartus, nes kiekvienas "HttpApplication" egzempliorius vienu metu gali apdoroti tik vieną užklausą ir ASP.NET palaiko tam tikrą skaičių vienu metu vykdomų užklausų, todėl "HttpApplication" egzempliorius bus sukurtas kelis kartus, kad būtų galima atsakyti į skirtingas užklausas, kai nepakanka atsakyti į vienu metu pateiktas užklausas. Kiekvienas "HttpApplication" egzempliorius sukuria naują "HttpModules" rinkinį ir sukūrus iškviečia "Init" metodą. Application_Start bus iškviestas tik sukūrus pirmąjį HttpApplication objektą, o vėlesni HttpApplication egzemplioriai šio įvykio nesuaktyvins. Manau, kad pakartotinis HttpApplication egzempliorių naudojimas yra pagrindinė priežastis, dėl kurios neteisingai suprantamas IHttpModule Init metodas, nes mes paprastai turime tik vieną užklausą, kai deriname programą, ir iš esmės neįmanoma pakartotinai vykdyti HttpModule Init metodo. Faktinėje svetainės veikiančioje aplinkoje vienu metu atliekamos užklausos, o jei netinkamai naudojamas Init metodas, tai gali sukelti keistų problemų tikrojoje aplinkoje. Konkrečios informacijos ieškokite MSDN "IIS 5.0 ir 6.0 ASP.NET programos gyvavimo ciklo apžvalga", kurioje pateikiami vaizdai straipsnyje: Taip pat galite naudoti Refelector norėdami dekompiliuoti System.Web rinkinį ir analizuoti IHttpModule.Init metodo iškvietimo ryšį. Galiausiai naudosite System.Web.HttpApplicationFactory.GetNormalApplicationInstance metodą, kuris parodo, kaip pakartotinai naudojami ir kuriami "HttpApplication" egzemplioriai. Apibendrinant galima pasakyti, kad IHttpModule.Init negali būti naudojamas tiesiog kaip Application_Start pakaitalas. Gana paprastas būdas yra naudoti statinį bool tipo lauką kaip inicijavimo žymę ir nustatyti žymę į true po inicijavimo, kurio reikalauja programa HttpModule, ir nekartoti inicijavimo kitą kartą. Tačiau kodą, pvz., "BeginRequest" įvykio registravimą, vis tiek reikia vykdyti kiekvieną kartą, kai vykdomas "Init", nes "HttpModule" egzempliorius šiuo metu skiriasi, jei vertinsite statinio inicijavimo žymėjimo lauką nekartodami registracijos įvykio, tai sukels keistų problemų, pvz., URL perrašymas, kartais vykdomas, o kartais nevykdomas.
[Mitas] Ar HttpApplication objekto Init metodas bus vykdomas tik vieną kartą?
Atsakymas: Jis bus vykdomas kelis kartus!!!!
|