|
Ho notato che molti amici, come me, usavano erroneamente IHttpModule.Init come alternativa Application_Start per eseguire alcune operazioni di inizializzazione dell'applicazione al suo interno. Tuttavia, la natura degli eventi Application_Start in IHttpModule.Init e Global.asax è diversa, e IHttpModule.Init non può essere utilizzato direttamente per sostituire Application_Start ASP.NET processo di inizializzazione dell'applicazione. Non può nemmeno essere semplicemente usato per concludere che il metodo Init viene ripetutamente chiamato a concludere che ASP.NET programma è stato riavviato. Il motivo è che IHttpModule.Init può essere chiamato più volte quando si risponde a una richiesta ASP.NET, ed è molto probabile che ciò accada durante l'effettiva gestione del sito web. Perché IHttpModule.Init viene chiamato più volte? Ogni istanza HttpApplication può gestire solo una richiesta alla volta e ASP.NET supporta un certo numero di richieste concorrenti, quindi l'istanza HttpApplication verrà creata più volte per rispondere a richieste diverse quando non è sufficiente rispondere a richieste concorrenti. Ogni istanza HttpApplication crea un nuovo insieme di HttpModules e chiama il metodo Init dopo essere stata creata. Application_Start verrà chiamato solo dopo la creazione del primo oggetto HttpApplication e le istanze successive di HttpApplication non attiveranno questo evento. Penso che il riutilizzo delle istanze HttpApplication sia una delle principali ragioni per la confusione sull'uso del metodo Init di IHttpModule, perché di solito abbiamo una sola richiesta quando si debugga un programma, ed è praticamente impossibile eseguire ripetutamente il metodo Init di HttpModule. Nell'ambiente effettivo di esecuzione del sito web, le richieste concorrenti sono comuni e, se il metodo Init viene usato in modo improprio, può causare problemi strani nell'ambiente reale. Per dettagli specifici, si prega di consultare la "Panoramica del ciclo di vita delle applicazioni ASP.NET per IIS 5.0 e 6.0" di MSDN, che fornisce immagini nell'articolo: Puoi anche usare Refelector per decompilare l'assembly System.Web e analizzare la relazione di chiamata del metodo IHttpModule.Init. Otterrai il metodo System.Web.HttpApplicationFactory.GetNormalApplicationInstance, che mostra come le istanze di HttpApplication vengono riutilizzate e create. In sintesi, IHttpModule.Init non può essere semplicemente usato come sostituto di Application_Start. Un modo relativamente semplice è usare un campo di tipo bool statico come tag di inizializzazione, impostare il marchio su true dopo l'inizializzazione richiesta dal programma in HttpModule, senza ripetere l'inizializzazione la volta successiva. Tuttavia, codice come la registrazione dell'evento BeginRequest deve comunque essere eseguito ogni volta che viene eseguito Init, poiché l'istanza HttpModule in questo momento è diversa; se si giudica il campo di markup di inizializzazione statica senza ripetere l'evento di registrazione, si possono causare strani problemi come la riscrittura degli URL a volte eseguita e a volte meno.
[Mito] Il metodo Init dell'oggetto HttpApplication verrà eseguito solo una volta?
Risposta: Verrà eseguita più volte!!!!
|