Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 16308|Resposta: 0

[ASP.NET] [Mito] O método Init do objeto HttpApplication será executado apenas uma vez?

[Copiar link]
Publicado em 06/02/2017 17:29:28 | | | |
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!!!!





Anterior:Use o InternalsVisibleTo para adicionar "assembly amigo" ao assembly
Próximo:Concurso de regex Java para selecionar um número bonito
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com