Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 16308|Atbildi: 0

[ASP.NET] [Mīts] Vai HttpApplication objekta Init metode tiks izpildīta tikai vienu reizi?

[Kopēt saiti]
Publicēts 06.02.2017 17:29:28 | | | |
Es atklāju, ka daudzi draugi, tāpat kā es, kļūdaini izmantoja IHttpModule.Init kā Application_Start alternatīvu, lai tajā veiktu dažas lietojumprogrammu inicializācijas operācijas.
Tomēr Application_Start notikumu raksturs IHttpModule.Init un Global.asax ir atšķirīgs, un IHttpModule.Init nevar tieši izmantot, lai aizstātu Application_Start ASP.NET lietojumprogrammas inicializācijas procesu. To nevar arī vienkārši izmantot, lai secinātu, ka Init metode tiek atkārtoti aicināta, lai secinātu, ka ASP.NET programma ir restartēta.
Iemesls ir tāds, ka, atbildot uz pieprasījuma ASP.NET, IHttpModule.Init var izsaukt vairākas reizes, un, visticamāk, tas notiks faktiskās vietnes darbības laikā.
Kāpēc IHttpModule.Init tiek izsaukts vairākas reizes, jo katra HttpApplication instance vienlaikus var apstrādāt tikai vienu pieprasījumu un ASP.NET atbalsta noteiktu skaitu vienlaicīgu pieprasījumu, tāpēc HttpApplication instance tiks izveidota vairākas reizes, lai atbildētu uz dažādiem pieprasījumiem, ja nepietiek, lai atbildētu uz vienlaicīgiem pieprasījumiem. Katra HttpApplication instance izveido jaunu HttpModules kopu un pēc izveides izsauc Init metodi.
Application_Start tiks izsaukts tikai pēc pirmā HttpApplication objekta izveides, un nākamās HttpApplication instances šo notikumu neaktivizēs.
Es domāju, ka HttpApplication instanču atkārtota izmantošana ir galvenais iemesls pārpratumam par IHttpModule Init metodes izmantošanu, jo, atkļūdojot programmu, mums parasti ir tikai viens pieprasījums, un būtībā nav iespējams atkārtoti izpildīt HttpModule Init metodi. Faktiskajā tīmekļa vietnes darbības vidē vienlaicīgi pieprasījumi ir izplatīti, un, ja Init metode tiek izmantota ļaunprātīgi, tā var radīt dīvainas problēmas faktiskajā vidē.
Lai iegūtu detalizētu informāciju, lūdzu, skatiet MSDN "Pārskats par ASP.NET lietojumprogrammu dzīves ciklu IIS 5.0 un 6.0", kurā ir sniegti attēli rakstā:
Varat arī izmantot Refelector, lai dekompilētu System.Web montāžu un analizētu IHttpModule.Init metodes izsaukuma attiecības.
Jūs nonāksiet pie System.Web.HttpApplicationFactory.GetNormalApplicationInstance metodes, kas parāda, kā HttpApplication instances tiek atkārtoti izmantotas un izveidotas.
Kopumā IHttpModule.Init nevar vienkārši izmantot kā Application_Start aizstājēju.
Salīdzinoši vienkāršs veids ir izmantot statisko bool tipa lauku kā inicializācijas tagu un iestatīt atzīmi uz true pēc inicializācijas, ko pieprasa programma HttpModule, un nākamreiz neatkārtojiet inicializāciju.
Tomēr kods, piemēram, BeginRequest notikuma reģistrēšana, joprojām ir jāizpilda katru reizi, kad tiek izpildīts Init, jo HttpModule instance šobrīd ir atšķirīga, ja jūs vērtējat statisko inicializācijas iezīmēšanas lauku, neatkārtojot reģistrācijas notikumu, tas radīs dīvainas problēmas, piemēram, URL pārrakstīšana, kas dažreiz tiek izpildīta un dažreiz netiek izpildīta.

[Mīts] Vai HttpApplication objekta Init metode tiks izpildīta tikai vienu reizi?

Atbilde: Tas tiks izpildīts vairākas reizes!!!!





Iepriekšējo:Izmantojiet InternalsVisibleTo, lai montāžai pievienotu "draugu montāžu"
Nākamo:Java regex konkurss, lai izvēlētos skaistu skaitli
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com