Пакет приложений IIS 10 осенью

У нас есть приложение ASP.NET Core, используемое внутри, которое используется в рабочее время и пакет, который должен обрабатываться 3 часа утра каждое утро, которое запланировано HangFire следующим образом:

RecurringJob.AddOrUpdate(
                () => MyBatch(),
                "0 0 3 1/1 *");

Проблема заключается в том, что пул приложений переходит в спящий режим, и пакет не обрабатывается, если сайт не запускается вручную (обычно переходя на веб-сайт).

Я искал SO и подделывал эти настройки в пуле приложений, но без успеха: enter image description here

Некоторые источники, которые я использовал для изменения настроек:

Пул приложений используется в общей сложности 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".