Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 16308|Odpowiedź: 0

[ASP.NET] [Mit] Czy metoda Init obiektu HttpApplication zostanie wykonana tylko raz?

[Skopiuj link]
Opublikowano 06.02.2017 17:29:28 | | | |
Zauważyłem, że wielu znajomych, tak jak ja, błędnie używało IHttpModule.Init jako Application_Start alternatywy do wykonywania operacji inicjalizacji aplikacji.
Jednak charakter zdarzeń Application_Start w IHttpModule.Init i Global.asax jest inny, a IHttpModule.Init nie może być użyty bezpośrednio do zastąpienia Application_Start ASP.NET procesu inicjalizacji aplikacji. Nie można jej też po prostu użyć do wniosku, że metoda Init jest wielokrotnie wywoływana, by stwierdzić, że ASP.NET program został ponownie uruchomiony.
Powodem jest to, że IHttpModule.Init może być wywoływany wielokrotnie podczas odpowiadania na ASP.NET żądania, a bardzo prawdopodobne jest, że dzieje się to podczas faktycznej pracy strony.
Dlaczego IHttpModule.Init jest wywoływany wielokrotnie? Skoro każda instancja HttpApplication może obsłużyć tylko jedno żądanie naraz, a ASP.NET obsługuje określoną liczbę jednoczesnych żądań, więc instancja HttpApplication jest tworzona wielokrotnie, aby odpowiadać na różne żądania, gdy nie wystarczy, by odpowiedzieć na żądania równoległe. Każda instancja HttpApplication tworzy nowy zestaw HttpModules i wywołuje metodę Init po utworzeniu.
Application_Start zostanie wywołane dopiero po utworzeniu pierwszego obiektu HttpApplication, a kolejne instancje HttpApplication nie wywołają tego zdarzenia.
Uważam, że ponowne użycie instancji HttpApplication jest głównym powodem nieporozumienia dotyczącego metody Init w IHttpModule, ponieważ zazwyczaj mamy tylko jedno żądanie podczas debugowania programu i praktycznie niemożliwe jest powtarzane wykonywanie metody Init w HttpModule. W rzeczywistym środowisku uruchamiającym stronę internetową żądania współbieżne są powszechne, a jeśli metoda Init jest niewłaściwie używana, może powodować dziwne problemy w rzeczywistym środowisku.
Szczegółowe informacje można znaleźć w artykule MSDN "Overview of the ASP.NET Application Lifecycle for IIS 5.0 and 6.0", który zawiera obrazy w artykule:
Możesz także użyć Refelectora do dekompilacji asemblera System.Web i analizy zależności wywołań metody IHttpModule.Init.
Otrzymasz metodę System.Web.HttpApplicationFactory.GetNormalApplicationInstance, która pokazuje, jak instancje HttpApplication są ponownie wykorzystywane i tworzone.
Podsumowując, IHttpModule.Init nie może być po prostu zamiennika Application_Start.
Stosunkowo prostym sposobem jest użycie statycznego pola typu bool jako tagu inicjalizacyjnego i ustawienie znaku na true po inicjalizacji wymaganej przez program w HttpModule, a następnie nie powtarzanie inicjalizacji następnym razem.
Jednak kod taki jak rejestracja zdarzenia BeginRequest musi być wykonywany za każdym razem, gdy Init jest wykonywany, ponieważ instancja HttpModule jest obecnie inna – jeśli ocenisz pole statycznej inicjalizacji bez powtórzenia zdarzenia rejestracji, prowadzi to do dziwnych problemów, takich jak czasem przepisywanie URL, czasem wykonywane, a czasem nie.

[Mit] Czy metoda Init obiektu HttpApplication zostanie wykonana tylko raz?

Odpowiedź: Zostanie wykonany wielokrotnie!!!!





Poprzedni:Użyj InternalsVisibleTo, aby dodać "friend assembly" do asemblera
Następny:Konkurs Java regex na wybór pięknej liczby
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com