Почему конструктор HttpApplication вызывается несколько раз

Может ли кто-нибудь объяснить, почему конструктор пользовательского класса, производного от HttpApplication, вызывается несколько раз при запуске приложения?

Структура моего кода следующая:
— Мой класс Global в файле global.asax является производным от класса CustomApp.
CustomApp. Strong> класс является производным от класса HttpApplication.

Класс Global создается при запуске, но когда я ставлю точку останова в конструкторе, он вызывается несколько раз! Я думал, что должен быть создан только один экземпляр класса Application?

Я ошибся?

UPD: веб-сервер действительно может создать несколько экземпляров HttpApplication для обработки нескольких запросов, поступающих одновременно. Это становится особенно очевидным, когда вы помещаете точку останова в конструктор вашего потомка HttpApplication. Несколько запросов будут ожидать от клиента (содержимое http, файлы CSS и т. д.), и для обслуживания каждого из них веб-сервер создаст новые экземпляры HttpApp. Так что остерегайтесь этого при написании логики инициализации приложения.


person Andy    schedule 06.06.2009    source источник
comment
можно ли опубликовать урезанный фрагмент кода, демонстрирующий такое поведение?   -  person Mitch Wheat    schedule 06.06.2009


Ответы (2)


Я считаю, что среда выполнения ASP.NET может создать более одного HttpApplication для каждого домена приложения. Таким образом, HttpApplication.Init и Ctor могут вызываться более одного раза.

Если вы хотите, чтобы код инициализации выполнялся только один раз, вам следует использовать событие Application_Start, которое будет вызываться только один раз для каждого приложения.

person mckamey    schedule 07.06.2009
comment
Есть ли событие (или подобное), к которому я могу подключиться для Applcation_Start, поскольку мне нужен класс HttpApplication за пределами веб-сайта? - person Mark Broadhurst; 27.01.2010
comment
Просто реализуйте метод Applcation_Start в Global.asax.cs, и он будет автоматически подключен и вызван во время запуска. msdn.microsoft.com/en-us/library/ms178473.aspx - person mckamey; 28.01.2010
comment
Однако имейте в виду, что такие события, как AuthenticateRequest или AcquireRequestState, не срабатывают, если вы регистрируете обработчики событий в Application_Start(). Вы можете зарегистрировать их в Init(), что является переопределением HttpApplication. - person Manfred; 05.10.2014

Пожалуйста, взгляните на сообщение global.asax в ASP.NET - это объясняет, почему существует несколько экземпляров HttpApplication. В основном есть два бассейна: специальный и обычный. Обычный пул содержит экземпляры HttpApplication, которые используются запросами (каждый запрос имеет свой собственный экземпляр HttpApplication). Специальный пул содержит объекты HttpApplication, используемые для событий уровня приложения (например, Application_Start, Application_Error).

person consept    schedule 05.08.2011