Metoda HttpModule Init jest wywoływana kilka razy - dlaczego?

Tworzyłem moduł http i podczas debugowania zauważyłem coś, co początkowo wydawało się dziwne.

Kiedy ustawiam punkt przerwania w metodzie init httpmodule, widzę, że metoda inicjowania modułu http jest wywoływana kilka razy, mimo że uruchomiłem tylko stronę internetową do debugowania i wykonałem jedno żądanie (czasami jest to tylko 1 raz , innym razem aż 10 razy).

Wiem, że powinienem oczekiwać, że kilka wystąpień aplikacji HttpApplication będzie uruchomionych, a dla każdego z nich zostaną utworzone moduły http, ale gdy zażądam pojedynczej strony, powinna ona być obsługiwana przez pojedynczy obiekt aplikacji http, a zatem tylko wywoływać zdarzenia powiązane raz, ale nadal wywołuje zdarzenia kilka razy dla każdego żądania, które nie ma sensu - poza tym, że musi zostać dodane kilka razy w ramach tej httpApplication - co oznacza, że ​​jest to ta sama metoda inicjowania httpmodule, która jest wywoływana za każdym razem, a nie nowa aplikacja http tworzone za każdym razem, gdy trafi w mój punkt przerwania (patrz przykład mojego kodu na dole itp.).

Co może tu być nie tak? czy to dlatego, że debuguję i ustawiam punkt przerwania w module http?

Zauważyłem, że jeśli uruchomię stronę internetową do debugowania i szybko przejdę przez punkt przerwania w httpmodule, to trafi on tylko raz na metodę init i to samo dotyczy modułu obsługi zdarzeń. Jeśli zamiast tego pozwolę mu się zawiesić w punkcie przerwania na kilka sekund, metoda init jest wywoływana kilka razy (wydaje się, że zależy od tego, jak długo będę czekać przed przejściem przez punkt przerwania). Być może może to być funkcja wbudowana, aby upewnić się, że httpmodule jest inicjowany, a aplikacja http może obsługiwać żądania, ale wydaje się również, że może mieć katastrofalne konsekwencje.

Może to wydawać się logiczne, ponieważ może próbować zakończyć żądanie, a ponieważ ustawiłem punkt przerwania, myśli, że coś poszło nie tak i spróbuj ponownie wywołać metodę init? tak, może obsłużyć żądanie?

Ale czy to właśnie się dzieje i czy wszystko jest w porządku (po prostu zgaduję), czy jest to prawdziwy problem?

Szczególnie martwi mnie to, że jeśli coś sprawi, że zawiesi się na serwerze „produkcja / na żywo” przez kilka sekund, wiele funkcji obsługi zdarzeń zostanie dodanych przez init, a zatem każde żądanie strony nagle wywoła moduł obsługi zdarzeń kilka razy.

Takie zachowanie może szybko sprowadzić dowolną witrynę.

Przyjrzałem się „oryginalnemu” kodowi .net używanemu dla httpmodules dla uwierzytelniania formularzy i rolemanagermodule itp., Ale mój kod nie różni się od tych używanych przez te moduły.

Mój kod wygląda tak.

    public void Init(HttpApplication app)
    {
        if (CommunityAuthenticationIntegration.IsEnabled)
        {
            FormsAuthenticationModule formsAuthModule = (FormsAuthenticationModule) app.Modules["FormsAuthentication"];         

            formsAuthModule.Authenticate += new FormsAuthenticationEventHandler(this.OnAuthenticate);
        }
    }

Oto przykład, jak to zrobić w module RoleManagerModule z platformy .NET

    public void Init(HttpApplication app)
    {
        if (Roles.Enabled)
        {
            app.PostAuthenticateRequest += new EventHandler(this.OnEnter);
            app.EndRequest += new EventHandler(this.OnLeave);
        }
    }

Czy ktoś wie, co się dzieje?

(mam tylko nadzieję, że ktoś może mi powiedzieć, dlaczego tak się dzieje i zapewnić mnie, że wszystko jest w porządku) :)

AKTUALIZACJA:

Próbowałem zawęzić problem i do tej pory odkryłem, że wywoływana metoda Init jest zawsze na nowym obiekcie mojego modułu http (w przeciwieństwie do tego, co myślałem wcześniej).

Wydaje mi się, że dla pierwszego żądania (podczas uruchamiania witryny) wszystkie tworzone obiekty HttpApplication i jej moduły próbują obsłużyć pierwsze żądanie i dlatego wszystkie trafiają do dodawanego modułu obsługi zdarzeń. Naprawdę nie wiem, dlaczego tak się dzieje.

Jeśli zażądam kolejnej strony, wszystkie utworzone przez HttpApplication (i ich moduless) ponownie spróbują obsłużyć żądanie, powodując wielokrotne trafienie do modułu obsługi zdarzeń.

Ale wydaje się również, że jeśli następnie wrócę do pierwszej strony (lub innej), tylko jedna aplikacja HttpApplication zacznie zajmować się żądaniem i wszystko będzie zgodne z oczekiwaniami - o ile nie pozwolę, aby zawiesiło się w punkcie przerwania.

Jeśli pozwolę mu się zawiesić w punkcie przerwania, zacznie tworzyć nowe obiekty HttpApplication i zacznie dodawać aplikacje HttpApplications (więcej niż 1), aby obsłużyć / obsłużyć żądanie (które jest już w trakcie obsługi przez HttpApplication, która jest aktualnie zatrzymana w punkcie przerwania) .

Sądzę lub mam nadzieję, że może to być jakiś inteligentny „za kulisami” sposób na dystrybucję i obsługę obciążeń i / lub błędów. Ale nie mam pojęcia. Mam nadzieję, że niektóre z nich mogą mnie zapewnić, że jest w porządku i jak ma być?