Расширенный: Сколько раз делает HttpModule Init (), метод называют во время срока действия приложения?

Инициализация веб-приложения следующие:

  1. Поскольку мы знаем, когда IIS получает первый запрос на конкретный ресурс приложений Asp.net, IIS создает экземпляр a HttpApplication (определенный в global.asax codebehind).
  2. То, когда этот новый экземпляр создается, это - инициализация, происходит, который также проверяет все настроенные HTTP-модули.
  3. Все модули затем инстанцируют и подают заявление Modules набор (типа HttpModuleCollection)
  4. модули циклично выполняются через и их 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() поскольку приложение запускает событие.

26
задан Robert Koritnik 30 July 2010 в 15:09
поделиться

2 ответа

Init () вызывается только один раз (для каждого экземпляра HttpApplication )

После того, как я проверил это, внутренняя работа инициализации IHttpModule выглядит следующим образом:

  1. Каждый IHttpModule инициализируется при запуске веб-приложения путем установки и вызова метода Init ()
  2. HttpApplication сохраняет все экземпляры модулей в своих Modules property
  3. Модули затем повторно используются в течение всего срока службы HttpApplication и не сбрасываются / не инициализируются повторно, пока приложение живо

Так что лучший результат -

Вы не можете прикрепить IHttpModule для событий уровня приложения, но вы можете использовать его метод Init () в качестве делегата события запуска псевдоприложения . Внутри него вы можете выполнить любой код, который вы обычно помещаете в делегат Application_Start в вашем Global.asax .

Вы также можете прочитать подробную информацию об этом в моем сообщении в блоге .

Но будьте осторожны в реальной среде веб-сервера.

Но IIS использует так называемые пулы приложений . И каждый пул может иметь произвольное количество экземпляров HttpApplication . Да, несколько. Запуск приложения создает все эти экземпляры. Каждый из них инициализирует свой собственный список модулей, но только первый выполняет обработчик события Application_OnStart .

Таким образом, всякий раз, когда ваш модуль изменяет какой-либо общий совместно используемый ресурс, вы должны принять дополнительные меры, чтобы указать, что первый модуль сделал это, а другие больше не будут этого делать. Прочтите об этом дополнительную запись в блоге , которая покажет вам, как и когда использовать блокировку потоков с вашим модулем, чтобы он действительно действовал как обработчик событий Application_OnStart . Кстати: при необходимости также можно обработать событие Application_OnEnd . ;)

Подробные ссылки на сообщения в блоге

  1. Написание пользовательского IHttpModule, который обрабатывает событие Application_OnStart
  2. Как правильно использовать IHttpModule для обработки события Application_OnStart
32
ответ дан 28 November 2019 в 07:36
поделиться

Application_Start запускается только один раз за время существования вашего приложения.

IHttpModule.Init запускается для каждого экземпляра HttpApplication перед началом обработки запроса. См. Пошаговое руководство . Init - это место, где вы можете регистрировать события, используемые для обработки запроса.

Экземпляр HttpApplication можно повторно использовать для нескольких запросов. ASP.Net объединяет объекты HttpApplication, поэтому Init будет вызываться один раз для каждого нового экземпляра HttpApplication

3
ответ дан 28 November 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: