Инициализация веб-приложения выглядит следующим образом:
- Как известно, когда IIS получает первый запрос для конкретного ресурса приложения Asp.net, IIS создает экземпляр
HttpApplication
(определенный вglobal.asax
codebehind). - Когда этот новый экземпляр создан, происходит инициализация, которая также проверяет все настроенные HTTP-модули.
- Все модули затем создаются и помещаются в коллекцию приложений
Modules
(типаHttpModuleCollection
) Модули - зацикливаются и вызывается их метод
Init()
(когда они регистрируются для событий запроса)
Насколько я понимаю, вышеупомянутый сценарий происходит, когда веб-приложение запускается/инициализируется (следовательно, событие запуска приложения).
Что происходит с модулями?
Выполняются ли они (повторно) по каждому запросу или повторно используются из свойства 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()
событием запуска приложения.