Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 16308|Odgovoriti: 0

[ASP.NET] [Mit] Ali bo metoda Init objekta HttpApplication izvedena samo enkrat?

[Kopiraj povezavo]
Objavljeno na 6. 02. 2017 17:29:28 | | | |
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!!!!





Prejšnji:Uporabi InternalsVisibleTo za dodajanje "friend assembly" v assembly
Naslednji:Java regex tekmovanje za izbiro lepe številke
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com