|
Ugotovil sem, da je veliko prijateljev, tako kot jaz, pomotoma uporabljalo IHttpModule.Init kot Application_Start alternativo za izvajanje nekaterih inicializacijskih operacij aplikacije. Vendar pa je narava Application_Start dogodkov v IHttpModule.Init in Global.asax drugačna, zato IHttpModule.Init ni mogoče neposredno uporabiti za zamenjavo Application_Start ASP.NET procesu inicializacije aplikacije. Prav tako ga ni mogoče preprosto uporabiti za sklepanje, da se metoda Init večkrat kliče za zaključek, da je ASP.NET program ponovno zagnal. Razlog je v tem, da se lahko IHttpModule.Init pokliče večkrat, ko odgovarja na zahtevo ASP.NET, in zelo verjetno se bo to zgodilo med dejanskim delovanjem spletne strani. Zakaj se IHttpModule.Init kliče večkrat? Ker lahko vsaka instanca HttpApplication hkrati obravnava le eno zahtevo in ASP.NET podpira določeno število sočasnih zahtev, zato bo instanca HttpApplication ustvarjena večkrat, da odgovori na različne zahteve, kadar ni dovolj za sočasne zahteve. Vsaka instanca HttpApplication ustvari nov nabor HttpModules in po ustvarjanju pokliče metodo Init. Application_Start bo klican šele po ustvarjanju prvega objekta HttpApplication, naslednje instance HttpApplication pa tega dogodka ne bodo sprožile. Mislim, da je ponovna uporaba instanc HttpApplication glavni razlog za napačno razumevanje uporabe metode Init v IHttpModule, saj običajno imamo le eno zahtevo pri odpravljanju napak programa in je praktično nemogoče večkrat izvajati metodo Init iz HttpModule. V dejanskem okolju za izvajanje spletne strani so sočasne zahteve pogoste, in če se metoda Init zlorablja, lahko povzroči nenavadne težave v dejanskem okolju. Za podrobnosti si oglejte MSDN-jev "Pregled življenjskega cikla aplikacije ASP.NET za IIS 5.0 in 6.0", ki vsebuje slike v članku: Uporabite lahko tudi Refelector za dekompilacijo System.Web sestavljanja in analizo klicne povezave metode IHttpModule.Init. Na koncu boste dobili metodo System.Web.HttpApplicationFactory.GetNormalApplicationInstance, ki prikazuje, kako se instance HttpApplication ponovno uporabljajo in ustvarjajo. Povzemimo, IHttpModule.Init ni mogoče preprosto uporabiti kot nadomestilo za Application_Start. Razmeroma preprost način je, da kot inicializacijsko oznako uporabite statično polje tipa bool in nastavite oznako na true po inicializaciji, ki jo zahteva program v HttpModule, ter naslednjič ne ponovite inicializacije. Vendar pa je treba kodo, kot je registracija dogodka BeginRequest, še vedno izvajati vsakič, ko se izvede Init, saj je instanca HttpModule trenutno drugačna; če presodite statično polje za označevanje inicializacije brez ponavljanja registracijskega dogodka, bo to povzročilo nenavadne težave, kot je včasih prepisovanje URL-jev, včasih izvedeno, včasih ne.
[Mit] Ali bo metoda Init objekta HttpApplication izvedena samo enkrat?
Odgovor: Izvedena bo večkrat!!!!
|