Коли використовувати Application_Start проти Init у Global.asax?


79

Мені цікаво, за яких обставин я повинен розміщувати код ініціалізації програми у Application_Start()vs Init()у своєму Global.asaxфайлі?

Різниця між ними здається мені не дуже очевидною, окрім того, що її Application_startвикликають першим, тоді Init().

  • Чому я маю використовувати одне над іншим?
  • Це насправді має значення?
  • Що змінюється у стані програми між цими двома подіями?

Поки що єдиний реальний вказівник, який я можу знайти, - це IHttpModuleлише Init()метод, тому, якщо те, що я роблю, може в якийсь момент бути більш придатним для реалізації, IHttpModuleя повинен використовувати Init()метод Global.asax, якщо ніщо інше для узгодженості.

Відповіді:


89

З документів MSDN :

Методи Application_Start та Application_End - це спеціальні методи, які не представляють подій HttpApplication. ASP.NET викликає їх один раз протягом життя домену програми, а не для кожного екземпляра HttpApplication .

У цьому:

Викликається один раз для кожного екземпляра класу HttpApplication після створення всіх модулів.

ОНОВЛЕННЯ: якщо вам потрібно переконатися, що певний код викликається лише один раз у програмі. життєвий цикл, Application_Start є кращим рішенням. Приклади: налаштування log4net?


4
Трохи подальшого запитання: коли створюється екземпляр HttpApplication? Я припускаю, що кожного разу, коли робочий процес перезапускається, і він буде містити по одному екземпляру для кожного робочого потоку?
roryf

2
@roryf - asp.net підтримує пул примірників програм, які можна використовувати повторно. Під обкладинками запити обслуговуються за допомогою пулу потоків CLR, і вхідні запити будуть у черзі понад певний поріг. Я сумніваюся, що вони ініціалізують пул екземплярів програми до цього порогового рівня, оскільки більшість веб-сайтів не бачать такого трафіку. Я підозрюю, що вони створюють пул з невеликою кількістю екземплярів, а потім збільшують розмір пулу по мірі зростання попиту.
Джоел Філлмор,

12

Так

Між ними є відмінності. Подія Application_Start () викликається лише один раз, тоді як метод Init () викликається кожного разу, коли створюється екземпляр програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.