статический класс в 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, все будет повторно инициализироваться.