Пакет приложений IIS 10 осенью
У нас есть приложение ASP.NET Core, используемое внутри, которое используется в рабочее время и пакет, который должен обрабатываться 3 часа утра каждое утро, которое запланировано HangFire
следующим образом:
RecurringJob.AddOrUpdate(
() => MyBatch(),
"0 0 3 1/1 *");
Проблема заключается в том, что пул приложений переходит в спящий режим, и пакет не обрабатывается, если сайт не запускается вручную (обычно переходя на веб-сайт).
Я искал SO и подделывал эти настройки в пуле приложений, но без успеха:
Некоторые источники, которые я использовал для изменения настроек:
Пул приложений используется в общей сложности 7 приложениями (все они неактивны в ночное время, когда пакет должен быть обработан). Используемый пул приложений использует .NET CLR Version
2.0
. Я использую IIS версии 10.0.17134.1.
Как я могу заставить Application Pool оставаться активным, чтобы периодичность вызывается регулярно каждое утро?
Ответы
Ответ 1
Они получили документацию о том, как настроить службу для запуска без остановки.
http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html#enabling-service-auto-start
Мой опыт (с более старыми версиями IIS 7.5, 8.0) заключается в том, что он работает, но не для утилизации пула приложений/для разгрузки домена. Обходным решением для меня было отправить запрос init на событие application_end.
Ответ 2
Я столкнулся с той же проблемой, когда мое основное приложение ASP.NET переходит в режим ожидания даже с "AlwaysRunning" в качестве режима запуска для пула приложений, "Preload Enabled" установлен на true для сайта, а время ожидания - 0. Я получил его для работы, установив модуль инициализации приложения и установив версию.NET CLR на версию 4.0. Не используйте "No Managed Code", так как это предотвратит запуск "Всегда запускается" при запуске приложения.
Я написал сообщение в блоге об этом объяснении в деталях шагов, которые я предпринял, чтобы приложение запускалось непрерывно.
Ответ 3
Как и выше - вам нужно включить Service Autostart - в дополнение к этому, если вы воспользовались несколькими исключениями, я обнаружил, что Rapid Fail Protection закрыла пулы приложений в прошлом при использовании HangFire. Поэтому также стоит отключить (или увеличить до разумных пределов) это в пуле приложений.
Ответ 4
Я бы посоветовал сначала включить в свой процесс один вызов HTTP-адреса, точно так же, как пинг, которого было бы достаточно для запуска запуска сайта, если он по какой-то причине не работает.
Другое дело, что при описании Microsoft в MSDN опция "AlwaysRunning" будет:
"Указывает, что служба активации Windows (WAS) всегда запускает пул приложений. Такое поведение позволяет приложению загружать рабочую среду до обслуживания любых HTTP-запросов, что уменьшает начальную обработку начальных HTTP-запросов для приложения. "
Возможно, для создания компиляции веб-страниц, которые выполняются при первом вызове, который необходимо выполнить перед любым запросом, но не может фактически запускать приложение в любое время.
Ответ 5
Я добавил повторяющееся задание, которое будет запускаться с интервалом в минуту меньше, чем IIS Timeout/Idle.
RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");
Вышеупомянутого CRON достаточно для того, чтобы пул приложений IIS не переходил в спящий режим.
Я использую RestSharp, чтобы сделать крошечный ping/GET запрос на "Self".