Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 16308|Válasz: 0

[ASP.NET] [Mítosz] A HttpApplication objektum Init metódus csak egyszer lesz elindítva?

[Linket másol]
Közzétéve 2017. 02. 06. 17:29:28 | | | |
Azt tapasztaltam, hogy sok barátom, akárcsak én, tévesen használta az IHttpModule.Init-et Application_Start alternatívaként néhány alkalmazás inicializációs művelethez.
Azonban az IHttpModule.Init és a Global.asax Application_Start események természete eltérő, és az IHttpModule.Init nem használható közvetlenül az alkalmazás inicializációs folyamatának Application_Start ASP.NET helyettesítésére. Nem lehet egyszerűen arra is felvonni, hogy az Init módszert ismételten hívják arra a következtetésre, hogy ASP.NET programot újraindítottak.
Ennek oka, hogy az IHttpModule.Init többször is meghívható, amikor ASP.NET kérésre válaszolnak, és ez nagyon valószínű, hogy a weboldal tényleges működése közben történik.
Miért hívják többször az IHttpModule.Init-et, mert minden HttpApplication példány egyszerre csak egy kérést tud kezelni, és ASP.NET bizonyos számú párhuzamos kérést támogat, így a HttpApplication példány többször is létrejön, hogy különböző kérésekre válaszoljon, ha az egyidejű kérésekre nem elég. Minden HttpApplication példány új HttpModul-készletet hoz létre, és a létrehozás után meghívja az Init metódust.
Application_Start csak az első HttpApplication objektum létrehozása után lesz meghívva, és a későbbi HttpApplication példányok nem indítják el ezt az eseményt.
Úgy gondolom, hogy a HttpApplication példányok újrafelhasználása az egyik fő oka annak, hogy félreértik az IHttpModule Init módszerét, mert általában csak egy kérés van egy program hibakeresésekor, és gyakorlatilag lehetetlen ismételten végrehajtani a HttpModule Init módszerét. A tényleges weboldal futó környezetében az egyidejű kérések gyakoriak, és ha az Init módszert rosszul használják, furcsa problémákat okozhatnak a környezetben.
Részletes részletekért kérjük, tekintse meg az MSDN "Áttekintése az ASP.NET alkalmazási életciklusról IIS 5.0 és 6.0 verziókhoz", amely képeket tartalmaz a cikkben is:
A Refelectorral dekompilálhatja a System.Web assembly rendszerét, és elemezheti az IHttpModule.Init metódus hívási kapcsolatát.
Végül a System.Web.HttpApplicationFactory.GetNormalApplicationInstance metódus kap, amely megmutatja, hogyan használják újra és hozzák létre a HttpApplication példányait.
Összefoglalva, az IHttpModule.Init nem használható egyszerűen a Application_Start helyettesítőjeként.
Egy viszonylag egyszerű mód, hogy egy statikus bool típusú mezőt használunk inicializációs címkéként, és a HttpModule-ban a program által előírt inicializáció után igazra állítjuk a jelölést, és legközelebb nem ismétlik meg az inicializációt.
Azonban olyan kódot, mint a BeginRequest esemény regisztrálása, még mindig végrehajtani kell minden alkalommal, amikor az Init végrehajtódik, mert a HttpModule példány ebben az időben más, ha a statikus inicializációs jelölőmezőt megítéled anélkül, hogy ismételnénk a regisztrációs eseményt, furcsa problémákhoz vezethet, mint például az URL újraírása, néha végrehajtás, néha nem futva.

[Mítosz] A HttpApplication objektum Init metódus csak egyszer lesz elindítva?

Válasz: Többször is végrehajtani fogják!!!!





Előző:Használd az InternalsVisibleTo funkciót, hogy hozzáadj "friend assembly" a assembly
Következő:Java regex verseny egy gyönyörű szám kiválasztásához
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com