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