Подтвердить что ты не робот

Дополнительно: Сколько раз метод HttpModule Init() вызывается во время работы приложения?

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

  • Как известно, когда 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() событием запуска приложения.

4b9b3361

Ответ 1

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

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

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

Таким образом, лучший результат

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

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

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

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

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

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

Ответ 2

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

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

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