Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 16308|Svar: 0

[ASP.NET] [Myt] Kommer HttpApplication-objektet Init-metoden bara att köras en gång?

[Kopiera länk]
Publicerad på 2017-02-06 17:29:28 | | | |
Jag upptäckte att många vänner, som jag, felaktigt använde IHttpModule.Init som ett Application_Start alternativ för att göra vissa applikationsinitieringsoperationer där.
Dock är karaktären på Application_Start händelser i IHttpModule.Init och Global.asax olika, och IHttpModule.Init kan inte användas direkt för att ersätta Application_Start ASP.NET initialiseringsprocessen i applikationen. Den kan inte heller bara användas för att dra slutsatsen att Init-metoden upprepade gånger anropas för att dra slutsatsen att ASP.NET program har startats om.
Anledningen är att IHttpModule.Init kan anropas flera gånger när man svarar på en förfrågan ASP.NET, och det är mycket sannolikt att det händer under själva webbplatsens drift.
Varför anropas IHttpModule.Init flera gånger eftersom varje HttpApplication-instans bara kan hantera en förfrågan åt gången, och ASP.NET stöder ett visst antal samtidiga förfrågningar, så HttpApplication-instansen kommer att skapas flera gånger för att svara på olika förfrågningar när det inte räcker till samtidiga förfrågningar. Varje HttpApplication-instans skapar en ny uppsättning HttpModules och anropar Init-metoden efter att den har skapats.
Application_Start anropas endast efter att det första HttpApplication-objektet har skapats, och efterföljande HttpApplication-instanser kommer inte att utlösa denna händelse.
Jag tror att återanvändningen av HttpApplication-instanser är en stor orsak till missförståndet kring användningen av IHttpModules Init-metod, eftersom vi vanligtvis bara har en förfrågan när vi felsöker ett program, och det är i princip omöjligt att upprepade gånger köra HttpModules Init-metod. I den faktiska webbplatsmiljön är samtidiga förfrågningar vanliga, och om Init-metoden missbrukas kan det orsaka konstiga problem i den faktiska miljön.
För specifika detaljer, se MSDN:s "Översikt av ASP.NET applikationslivscykel för IIS 5.0 och 6.0", som innehåller bilder i artikeln:
Du kan också använda Refelector för att dekompilera System.Web-assembleren och analysera anropsrelationen för IHttpModule.Init-metoden.
Du kommer att få metoden System.Web.HttpApplicationFactory.GetNormalApplicationInstance, som visar hur instanser av HttpApplication återanvänds och skapas.
Sammanfattningsvis kan IHttpModule.Init inte bara användas som ersättning för Application_Start.
Ett relativt enkelt sätt är att använda ett statiskt bool-typfält som initialiseringstagg och sätta markeringen till sann efter den initiering som krävs av programmet i HttpModule, och inte upprepa initialiseringen nästa gång.
Dock måste kod som registrering av BeginRequest-händelsen fortfarande köras varje gång Init körs, eftersom HttpModule-instansen vid denna tidpunkt är annorlunda, om du bedömer det statiska initialiseringsmarkupfältet utan att upprepa registreringshändelsen leder det till konstiga problem som URL-omskrivning som ibland utförs och ibland inte.

[Myt] Kommer HttpApplication-objektet Init-metoden bara att köras en gång?

Svar: Det kommer att utföras flera gånger!!!!





Föregående:Använd InternalsVisibleTo för att lägga till "friend assembly" i assembly
Nästa:Java regex-tävling för att välja ett vackert nummer
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com