|
Percebi que muitos amigos, como eu, usaram por engano o IHttpModule.Init como uma alternativa Application_Start para fazer algumas operações de inicialização de aplicação nele. No entanto, a natureza dos eventos Application_Start em IHttpModule.Init e Global.asax é diferente, e IHttpModule.Init não pode ser usado diretamente para substituir Application_Start ASP.NET processo de inicialização da aplicação. Também não pode ser usado simplesmente para concluir que o método Init é repetidamente chamado para concluir que ASP.NET programa foi reiniciado. A razão é que o IHttpModule.Init pode ser chamado várias vezes ao responder a uma solicitação ASP.NET, e é muito provável que isso aconteça durante a operação do site. Por que o IHttpModule.Init é chamado várias vezes, pois cada instância HttpApplication pode lidar com apenas uma requisição por vez, e ASP.NET suporta um certo número de requisições concorrentes, então a instância HttpApplication será criada várias vezes para responder a diferentes solicitações quando não é suficiente responder a solicitações concorrentes. Cada instância de HttpApplication cria um novo conjunto de HttpModules e chama o método Init após ser criada. Application_Start só serão chamados após a criação do primeiro objeto HttpApplication, e instâncias subsequentes de HttpApplication não dispararão esse evento. Acho que o reuso das instâncias HttpApplication é uma das principais razões para o mal-entendido sobre o uso do método Init do IHttpModule, porque geralmente só temos uma solicitação ao depurar um programa, e é basicamente impossível executar repetidamente o método Init do HttpModule. No ambiente real de execução do site, requisições simultâneas são comuns e, se o método Init for mal utilizado, pode causar problemas estranhos no ambiente real. Para detalhes específicos, consulte o "Visão Geral do Ciclo de Vida da Aplicação ASP.NET para IIS 5.0 e 6.0" da MSDN, que fornece imagens no artigo: Você também pode usar o Refelector para descompilar o assembly System.Web e analisar a relação de chamada do método IHttpModule.Init. Você acabará com o método System.Web.HttpApplicationFactory.GetNormalApplicationInstance, que mostra como as instâncias do HttpApplication são reutilizadas e criadas. Em resumo, IHttpModule.Init não pode ser simplesmente usado como substituto do Application_Start. Uma forma relativamente simples é usar um campo bool tipo estático como tag de inicialização, definir a marca como verdadeira após a inicialização exigida pelo programa no HttpModule, sem repetir a inicialização da próxima vez. No entanto, códigos como registrar o evento BeginRequest ainda precisam ser executados toda vez que o Init é executado, porque a instância do HttpModule neste momento é diferente; se você julgar o campo de marcação de inicialização estática sem repetir o evento de registro, isso pode causar problemas estranhos, como reescrita de URLs às vezes executada e às vezes não.
[Mito] O método Init do objeto HttpApplication será executado apenas uma vez?
Resposta: Será executado várias vezes!!!!
|