O método Init do HttpModule é chamado várias vezes - por quê?

Eu estava criando um módulo http e durante a depuração notei algo que no início (pelo menos) parecia um comportamento estranho.

Quando eu definir um ponto de interrupção no método init do httpmodule eu posso ver que o método init módulo http está sendo chamado várias vezes, embora eu tenha apenas iniciado o site para depuração e fez uma única solicitação (às vezes é atingido apenas 1 vez , outras vezes até 10 vezes).

Eu sei que devo esperar várias instâncias do HttpApplication para ser executado e para cada um dos módulos http será criado, mas quando eu solicitar uma única página, ele deve ser tratado por um único objeto de aplicativo http e, portanto, só disparar os eventos associados uma vez, mas ainda dispara os eventos várias vezes para cada pedido que não faz sentido - além de ter sido adicionado várias vezes dentro desse httpApplication - o que significa que é o mesmo método init de httpmodule que está sendo chamado toda vez e não um novo aplicativo http sendo criado cada vez que atinge meu ponto de quebra (veja meu exemplo de código na parte inferior etc.).

O que poderia estar errado aqui? é porque eu estou depurando e definir um ponto de interrupção no módulo http?

Notei que parece que se eu iniciar o site para depuração e passar rapidamente pelo ponto de interrupção no httpmodule, ele só atingirá o método init uma vez e o mesmo vale para o manipulador de eventos. Se eu, em vez disso, deixá-lo pendurado no ponto de interrupção por alguns segundos, o método init está sendo chamado várias vezes (parece que depende de quanto tempo eu espero antes de pisar o ponto de interrupção). Talvez isso possa ser algum recurso para garantir que o httpmodule seja inicializado e o aplicativo http possa atender às solicitações, mas também parece algo que poderia ter consequências catastróficas.

Isto pode parecer lógico, pois pode estar a tentar terminar o pedido e, uma vez que defini o ponto de quebra, pensa que algo correu mal e tente chamar o método init de novo? soo ele pode lidar com o pedido?

Mas é isso que está acontecendo e está tudo bem (estou apenas supondo), ou é um problema real?

O que eu estou especialmente preocupado é que se algo faz ficar pendurado no servidor "produção / live" por alguns segundos, muitos manipuladores de eventos são adicionados através do init e, portanto, cada solicitação para a página dispara o manipulador de eventos várias vezes.

Esse comportamento pode rapidamente derrubar qualquer site.

Eu olhei para o código .net "original" usado para os httpmodules para formsauthentication e o rolemanagermodule etc, mas meu código não é diferente de usar esses módulos.

Meu código é assim.

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

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

Aqui está um exemplo de como é feito no RoleManagerModule a partir do framework .NET

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

Alguém sabe o que está acontecendo?

(Eu só espero que alguém possa me dizer por que isso está acontecendo e me assegurar que tudo está perfeitamente bem) :)

ATUALIZAR:

Eu tentei diminuir o problema e até agora eu descobri que o método de inicialização sendo chamado está sempre em um novo objeto do meu módulo http (contary ao que eu pensava antes).

Parece que, para a primeira solicitação (ao iniciar o site), todos os objetos HttpApplication que estão sendo criados e seus módulos estão tentando atender à primeira solicitação e, portanto, todos atingem o manipulador de eventos que está sendo adicionado. Eu não consigo entender porque isso está acontecendo.

Se eu solicitar outra página, todos os HttpApplication criados (e seus módulos) tentarão novamente atender à solicitação, fazendo com que ela atinja o manipulador de eventos várias vezes.

Mas também parece que se eu pular de volta para a primeira página (ou para outra), apenas um HttpApplication vai começar a cuidar do pedido e tudo está como esperado - contanto que eu não o deixe pendurar em um ponto de interrupção.

Se eu deixá-lo pendurado em um ponto de interrupção, ele começa a criar novos objetos HttpApplication e começa a adicionar HttpApplications (mais de 1) para atender / manipular a solicitação (que já está em processo de ser atendida pelo HttpApplication, que está atualmente parado no ponto de interrupção) .

Eu acho ou espero que possa ser uma maneira inteligente de "nos bastidores" ajudar a distribuir e lidar com a carga e / ou erros. Mas eu não tenho ideia. Espero que alguém possa me assegurar que está tudo bem e como deve ser?

questionAnswers(4)

yourAnswerToTheQuestion