Инициализация веб-приложения следующие:
HttpApplication
(определенный в global.asax
codebehind).Modules
набор (типа HttpModuleCollection
)Init()
метод называют (когда они регистрируются для событий запроса),Насколько я понимаю это, вышеупомянутый сценарий происходит, когда веб-приложение запускается/инициализируется (следовательно, приложение запускает событие).
Они (ре) instatiated по каждому запросу или снова использованы от Modules
свойство по каждому последовательному запросу, в то время как веб-приложение живо? Поскольку я понимаю IIS и Asp.net, они снова используются через целую жизнь веб-приложения.
Если они снова используются, можем мы предполагать что их Init()
метод является на самом деле псевдо обработчиком событий для приложения, запускают событие? Вещь, мы не можем присоединить к событиям уровня приложения в http модулях. Но если они снова используются, мы могли бы использовать Init()
как приложение запускают событие и делают то, что мы вставили global.asax
вместо этого.
Мы можем предположить что модуль Init()
метод называют только на приложении, запускают событие? Мы могли использовать это предположение т.е. зарегистрировать маршруты для приложений чей global.asax
codebehind мы не можем измениться? web.config
обычно доступно, и мы можем изменить его способ, которым мы хотим.
Это на самом деле работало бы?
Мы можем проверить HttpApplication
кодируйте и проверьте InitModulesCommon()
метод. Этот на самом деле звонит Init()
из каждого зарегистрированного HTTP-модуля. То, что более интересно, - то, что этот метод только используется InitIntegratedModules()
и InitModules()
методы. Которые оба используются только в HttpApplication.InitInternal()
метод. Это - основание моих предположений, но я хотел бы знать, злоупотребил ли кто-то IHttpModule.Init()
поскольку приложение запускает событие.
Init ()
вызывается только один раз (для каждого экземпляра HttpApplication
) После того, как я проверил это, внутренняя работа инициализации IHttpModule
выглядит следующим образом:
IHttpModule
инициализируется при запуске веб-приложения путем установки и вызова метода Init ()
HttpApplication
сохраняет все экземпляры модулей в своих Modules
property HttpApplication
и не сбрасываются / не инициализируются повторно, пока приложение живо Вы не можете прикрепить IHttpModule
для событий уровня приложения, но вы можете использовать его метод Init ()
в качестве делегата события запуска псевдоприложения . Внутри него вы можете выполнить любой код, который вы обычно помещаете в делегат Application_Start
в вашем Global.asax
.
Вы также можете прочитать подробную информацию об этом в моем сообщении в блоге .
Но IIS использует так называемые пулы приложений . И каждый пул может иметь произвольное количество экземпляров HttpApplication
. Да, несколько. Запуск приложения создает все эти экземпляры. Каждый из них инициализирует свой собственный список модулей, но только первый выполняет обработчик события Application_OnStart
.
Таким образом, всякий раз, когда ваш модуль изменяет какой-либо общий совместно используемый ресурс, вы должны принять дополнительные меры, чтобы указать, что первый модуль сделал это, а другие больше не будут этого делать. Прочтите об этом дополнительную запись в блоге , которая покажет вам, как и когда использовать блокировку потоков с вашим модулем, чтобы он действительно действовал как обработчик событий Application_OnStart
. Кстати: при необходимости также можно обработать событие Application_OnEnd
. ;)
Application_Start запускается только один раз за время существования вашего приложения.
IHttpModule.Init запускается для каждого экземпляра HttpApplication перед началом обработки запроса. См. Пошаговое руководство . Init - это место, где вы можете регистрировать события, используемые для обработки запроса.
Экземпляр HttpApplication можно повторно использовать для нескольких запросов. ASP.Net объединяет объекты HttpApplication, поэтому Init будет вызываться один раз для каждого нового экземпляра HttpApplication