Die Methode HttpModule Init wird mehrmals aufgerufen - warum?

Ich habe ein http-Modul erstellt und beim Debuggen etwas bemerkt, das zunächst (zumindest) seltsam wirkte.

Wenn ich einen Haltepunkt in der Init-Methode des http-Moduls setze, kann ich sehen, dass die http-Modul-Init-Methode mehrmals aufgerufen wird, obwohl ich die Website nur zum Debuggen gestartet und eine einzige Anfrage gestellt habe (manchmal wird sie nur einmal getroffen) , andere Male bis zu 10 Mal).

Ich weiß, dass ich davon ausgehen sollte, dass mehrere Instanzen der HttpApplication ausgeführt werden und für jedes die http-Module erstellt werden, aber wenn ich eine einzelne Seite anfordere, sollte sie von einem einzelnen http-Anwendungsobjekt verarbeitet werden und daher die damit verbundenen Ereignisse nur einmal auslösen. Trotzdem werden die Ereignisse mehrmals für jede Anforderung ausgelöst, was keinen Sinn ergibt - es muss jedoch mehrmals in dieser httpApplication hinzugefügt worden sein -, was bedeutet, dass jedes Mal dieselbe httpmodule init-Methode aufgerufen wird und keine neue http-Anwendung Wird jedes Mal erstellt, wenn mein Haltepunkt erreicht wird (siehe mein Codebeispiel unten usw.).

Was könnte hier schief gehen? liegt es daran, dass ich debugge und im http-modul einen breakpoint setze?

Es hat bemerkt, dass es scheint, dass wenn ich die Website zum Debuggen starte und schnell über den Haltepunkt im http-Modul gehe, die init-Methode nur einmal getroffen wird, und dasselbe gilt für den Eventhandler. Wenn ich es stattdessen für ein paar Sekunden am Haltepunkt hängen lasse, wird die init-Methode mehrmals aufgerufen (es scheint, als hänge es davon ab, wie lange ich warte, bevor ich über den Haltepunkt gehe). Möglicherweise könnte dies eine eingebaute Funktion sein, um sicherzustellen, dass das http-Modul initialisiert ist und die http-Anwendung Anforderungen bedienen kann, aber es scheint auch, als ob dies katastrophale Folgen haben könnte.

Dies könnte logisch erscheinen, da es möglicherweise versucht, die Anforderung zu beenden, und da ich den Haltepunkt festgelegt habe, denkt es, dass etwas schief gelaufen ist und versucht, die init-Methode erneut aufzurufen? soo kann es die Anfrage bearbeiten?

Aber ist es das, was passiert und ist alles in Ordnung (ich rate nur), oder ist es ein echtes Problem?

Was mich besonders beunruhigt ist, dass, wenn etwas für ein paar Sekunden auf dem "Production / Live" -Server hängen bleibt, viele Event-Handler durch den Init hinzugefügt werden und daher jede Anfrage auf der Seite den Event-Handler plötzlich mehrmals auslöst.

Dieses Verhalten kann dazu führen, dass Websites schnell heruntergefahren werden.

Ich habe mir den "ursprünglichen" .net-Code angesehen, der für die http-Module für die Formularauthentifizierung und das rolemanagermodule usw. verwendet wurde, aber mein Code unterscheidet sich nicht von dem, den diese Module verwenden.

Mein Code sieht so aus.

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

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

Hier ist ein Beispiel, wie dies im RoleManagerModule aus dem .NET Framework heraus gemacht wird

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

Weiß jemand was los ist?

(Ich hoffe nur, dass jemand da draußen mir sagen kann, warum das passiert und mir versichern kann, dass alles in Ordnung ist) :)

AKTUALISIEREN:

Ich habe versucht, das Problem einzugrenzen und bis jetzt habe ich festgestellt, dass die aufgerufene Init-Methode immer auf einem neuen Objekt meines http-Moduls ist (im Gegensatz zu dem, was ich vorher gedacht habe).

Ich scheine, dass für die erste Anforderung (beim Starten der Site) alle HttpApplication-Objekte, die erstellt werden, und ihre Module alle versuchen, die erste Anforderung zu bedienen, und daher alle den Event-Handler treffen, der hinzugefügt wird. Ich kann nicht wirklich herausfinden, warum das passiert.

Wenn ich eine andere Seite anfordere, versuchen alle von HttpApplication erstellten (und deren modullosen) Anwendungen erneut, die Anfrage zu bearbeiten, was dazu führt, dass der Eventhandler mehrmals aufgerufen wird.

Es scheint aber auch, dass, wenn ich dann zur ersten Seite zurückspringe (oder zu einer anderen), sich nur eine HttpApplication um die Anfrage kümmert und alles wie erwartet ist - solange ich es nicht an einer Unterbrechungsstelle hängen lasse.

Wenn ich es an einem Haltepunkt hängen lasse, beginnt es, neue HttpApplication-Objekte zu erstellen und fügt HttpApplications (mehr als 1) hinzu, um die Anforderung zu bedienen / zu behandeln (die bereits von der HttpApplication bedient wird, die derzeit am Haltepunkt gestoppt ist). .

Ich vermute oder hoffe, dass dies eine intelligente Methode ist, um die Last und / oder Fehler zu verteilen und damit umzugehen. Aber ich habe keine Ahnung. Ich hoffe einige da draußen können mir versichern, dass es vollkommen in Ordnung ist und wie es sein soll?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage