Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 16308|Atsakyti: 0

[ASP.NET] [Mitas] Ar HttpApplication objekto Init metodas bus vykdomas tik vieną kartą?

[Kopijuoti nuorodą]
Paskelbta 2017-02-06 17:29:28 | | | |
Pastebėjau, kad daugelis draugų, kaip ir aš, klaidingai naudojo IHttpModule.Init kaip Application_Start alternatyvą kai kurioms programų inicijavimo operacijoms atlikti.
Tačiau Application_Start įvykių pobūdis IHttpModule.Init ir Global.asax skiriasi, o IHttpModule.Init negali būti naudojamas tiesiogiai pakeisti Application_Start ASP.NET programos inicijavimo procesą. Taip pat negalima paprasčiausiai daryti išvadą, kad Init metodas yra pakartotinai naudojamas išvadai, kad ASP.NET programa buvo paleista iš naujo.
Priežastis ta, kad IHttpModule.Init gali būti iškviestas kelis kartus atsakant į užklausos ASP.NET, ir labai tikėtina, kad tai įvyks faktinio svetainės veikimo metu.
Kodėl IHttpModule.Init iškviečiamas kelis kartus, nes kiekvienas "HttpApplication" egzempliorius vienu metu gali apdoroti tik vieną užklausą ir ASP.NET palaiko tam tikrą skaičių vienu metu vykdomų užklausų, todėl "HttpApplication" egzempliorius bus sukurtas kelis kartus, kad būtų galima atsakyti į skirtingas užklausas, kai nepakanka atsakyti į vienu metu pateiktas užklausas. Kiekvienas "HttpApplication" egzempliorius sukuria naują "HttpModules" rinkinį ir sukūrus iškviečia "Init" metodą.
Application_Start bus iškviestas tik sukūrus pirmąjį HttpApplication objektą, o vėlesni HttpApplication egzemplioriai šio įvykio nesuaktyvins.
Manau, kad pakartotinis HttpApplication egzempliorių naudojimas yra pagrindinė priežastis, dėl kurios neteisingai suprantamas IHttpModule Init metodas, nes mes paprastai turime tik vieną užklausą, kai deriname programą, ir iš esmės neįmanoma pakartotinai vykdyti HttpModule Init metodo. Faktinėje svetainės veikiančioje aplinkoje vienu metu atliekamos užklausos, o jei netinkamai naudojamas Init metodas, tai gali sukelti keistų problemų tikrojoje aplinkoje.
Konkrečios informacijos ieškokite MSDN "IIS 5.0 ir 6.0 ASP.NET programos gyvavimo ciklo apžvalga", kurioje pateikiami vaizdai straipsnyje:
Taip pat galite naudoti Refelector norėdami dekompiliuoti System.Web rinkinį ir analizuoti IHttpModule.Init metodo iškvietimo ryšį.
Galiausiai naudosite System.Web.HttpApplicationFactory.GetNormalApplicationInstance metodą, kuris parodo, kaip pakartotinai naudojami ir kuriami "HttpApplication" egzemplioriai.
Apibendrinant galima pasakyti, kad IHttpModule.Init negali būti naudojamas tiesiog kaip Application_Start pakaitalas.
Gana paprastas būdas yra naudoti statinį bool tipo lauką kaip inicijavimo žymę ir nustatyti žymę į true po inicijavimo, kurio reikalauja programa HttpModule, ir nekartoti inicijavimo kitą kartą.
Tačiau kodą, pvz., "BeginRequest" įvykio registravimą, vis tiek reikia vykdyti kiekvieną kartą, kai vykdomas "Init", nes "HttpModule" egzempliorius šiuo metu skiriasi, jei vertinsite statinio inicijavimo žymėjimo lauką nekartodami registracijos įvykio, tai sukels keistų problemų, pvz., URL perrašymas, kartais vykdomas, o kartais nevykdomas.

[Mitas] Ar HttpApplication objekto Init metodas bus vykdomas tik vieną kartą?

Atsakymas: Jis bus vykdomas kelis kartus!!!!





Ankstesnis:Naudokite InternalsVisibleTo norėdami pridėti "draugų asamblėją" prie surinkimo
Kitą:Java regex konkursas pasirinkti gražų skaičių
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com