Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 16308|Svar: 0

[ASP.NET] [Myte] Vil HttpApplication-objektet Init-metoden kun blive udført én gang?

[Kopier link]
Opslået på 06/02/2017 17.29.28 | | | |
Jeg har oplevet, at mange venner, ligesom mig, fejlagtigt brugte IHttpModule.Init som et Application_Start alternativ til at lave nogle applikationsinitialiseringsoperationer i det.
Dog er karakteren af Application_Start hændelser i IHttpModule.Init og Global.asax forskellig, og IHttpModule.Init kan ikke bruges direkte til at erstatte Application_Start ASP.NET initialiseringsprocessen af applikationen. Den kan heller ikke blot bruges til at konkludere, at Init-metoden gentagne gange kaldes for at konkludere, at ASP.NET program er genstartet.
Årsagen er, at IHttpModule.Init kan blive kaldt flere gange, når man svarer på en forespørgsel ASP.NET, og det er meget sandsynligt, at det sker under selve websitets drift.
Hvorfor kaldes IHttpModule.Init flere gange? Fordi hver HttpApplication-instans kun kan håndtere én forespørgsel ad gangen, og ASP.NET understøtter et vist antal samtidige forespørgsler, så HttpApplication-instansen vil blive oprettet flere gange for at besvare forskellige forespørgsler, når det ikke er nok til at besvare samtidige forespørgsler. Hver HttpApplication-instans opretter et nyt sæt HttpModules og kalder Init-metoden efter oprettelsen.
Application_Start vil kun blive kaldt, efter at det første HttpApplication-objekt er oprettet, og efterfølgende HttpApplication-instanser vil ikke udløse denne hændelse.
Jeg tror, genbruget af HttpApplication-instanser er en væsentlig årsag til misforståelsen af brugen af IHttpModules Init-metode, fordi vi normalt kun har én forespørgsel, når vi fejlsøger et program, og det er stort set umuligt at gentagne gange køre HttpModules Init-metode. I selve website-kørende miljøet er samtidige forespørgsler almindelige, og hvis Init-metoden misbruges, kan det forårsage mærkelige problemer i det faktiske miljø.
For specifikke detaljer, se venligst MSDN's "Oversigt over ASP.NET applikationslivscyklus for IIS 5.0 og 6.0", som indeholder billeder i artiklen:
Du kan også bruge Refelector til at dekompilere System.Web-assemblyen og analysere kaldforholdet for IHttpModule.Init-metoden.
Du ender med metoden: System.Web.HttpApplicationFactory.GetNormalApplicationInstance, som viser, hvordan instanser af HttpApplication genbruges og oprettes.
Sammenfattende kan IHttpModule.Init ikke blot bruges som erstatning for Application_Start.
En relativt simpel måde er at bruge et statisk bool-type felt som initialiseringstag og sætte markeringen til true efter den initialisering, programmet i HttpModule kræver, og ikke gentage initialiseringen næste gang.
Dog skal kode som registrering af BeginRequest-hændelsen stadig udføres hver gang Init udføres, fordi HttpModule-instansen på dette tidspunkt er anderledes; hvis du vurderer det statiske initialiseringsmarkup-felt uden at gentage registreringsbegivenheden, vil det føre til mærkelige problemer som URL-omskrivning, nogle gange udført og andre gange ikke.

[Myte] Vil HttpApplication-objektet Init-metoden kun blive udført én gang?

Svar: Det vil blive udført flere gange!!!!





Tidligere:Brug InternalsVisibleTo til at tilføje "friend assembly" til assembly
Næste:Java regex-konkurrence for at vælge et smukt nummer
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com