Почему IIS "запускает" приложение, которое все еще работает?

У нас есть приложение ASP.NET (3.5 SP1), работающее на IIS7 / Windows 2008. Мы перехватываем события Application_Start и Application_End в Global.asax. Мы также размещаем службы WCF в приложении и перехватываем события OnOpening и OnClosing через ServiceHostFactory. Таким образом, мы подумали, что нам гарантировано уведомление о любом запуске и остановке приложения, запланированном или незапланированном.

Несколько дней назад наше приложение перехватило событие Application_Start, находясь в состоянии "запущен" / "запущен".

Событие Application_End не предшествовало Application_Start (и даже не следовало за ним несколько минут спустя, если учитывать условия гонки).

Нашей первой мыслью было, что наше приложение на самом деле молча зависло и прекратило работу. На самом деле произошло то, что новый домен приложений развернулся для обработки входящих запросов, но фоновые потоки существующего домена приложений (мы много чего делаем в потоках ThreadPool) работали в течение нескольких дней - пока я не убил их с помощью IISRESET.

Предполагается, что Application_End не сработал, потому что оригинальный App Domain не завершился... но тогда почему Application_Start сработал?

Ищите подсказку или документ, описывающий, как этот механизм полуотключения +AppDomainStartup работает в ASP.NET.

Заранее спасибо,

Говард Хоффман

1 ответ

Пожалуйста, ознакомьтесь с утилизацией пула приложений, которая может привести к таким ситуациям. Когда IIS решает перезапустить пул, он сначала сначала инициализирует новый рабочий процесс (по очереди будет вызываться Application_Start), а затем выключает старый (Application_End).

Я предлагаю вам добавить некоторые журналы уровня приложения с идентификатором процесса в журналах, чтобы лучше понять, прав ли мой приведенный выше анализ.

Для разработчиков ASP.NET рекомендуется больше узнать об IIS.

Другие вопросы по тегам