статический класс в Asp.NET MVC приложение
Мне интересно, если статический класс вASP.NET MVC приложение может быть инициализируется более одного раза. Первоначально я разработал свое приложение так, чтобы статический компонент извлекал некоторые вещи из базы данных и служил в качестве кэша, и я добавил метод refresh в класс, который был вызван из конструктора. Метод обновления также был доступен через административную часть приложения. В какой-то момент я заметил, что данные были обновлены без требуется этот ручной триггер, который подразумевает, что статический конструктор выполняется более одного раза.
есть несколько сценариев, где я мог бы разумно видеть, что это произойдет, например необработанный Exception
вызывает повторную инициализацию. Но у меня возникли проблемы с воспроизведением этого, поэтому я хотел бы знать наверняка.
2 ответов
самыми обычными сценариями были бы:
-
перезагрузка веб-приложения
- коснулся паутины.config
- трогал файлы
- аномальное завершение (из памяти, ошибки разрешения)
перезагрузка пула приложений
- перезапуск IIS
- перезапуск w3wp.exe (хотя бы раз в 29 часов!)
приложение-домен получит перезагрузка (при необходимости перекомпиляция динамических частей), и это приведет к аннулированию любых статически инициализированных данных.
вы можете обойти это, сохранив статические данные где-то, если их создание дорого, или избежать перезагрузки AppDomain, пула приложений или сервера IIS.
обновление: Фил Хаак только что опубликовал соответствующую запись в блоге здесь: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx
- Bye Bye Домен Приложения
- это делает лучшую работу по объяснению выше. Примечательно, что IIS будет перерабатывать рабочий процесс очень 29 часов как минимум, а общие хостеры будут перерабатывать AppDomain гораздо чаще (возможно, за 20 минут простоя)
- так скажите ASP.NET-Эй, я здесь работаю!"
- контуры методы, которые вы можете применить, чтобы получить уведомление о AppDomain снять -вы может использовать это, чтобы ваш экземпляр Singleton вел себя "правильно"
- рекомендация
Я предлагаю вам прочитать это :)
static
классы инициализируются один раз в AppDomain.
Если IIS повторно использует ваш AppDomain, все будет повторно инициализироваться.