Пул приложений 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.

Как сделать так, чтобы пул приложений оставался активным, чтобы пакет можно было запускать регулярно каждое утро?


person Westerlund.io    schedule 15.07.2018    source источник
comment
Насколько я понимаю, настройки у вас должны работать. Вы пробовали переместить его в собственный пул приложений?   -  person Pieter Alberts    schedule 17.07.2018
comment
Спасибо за комментарий @PieterAlberts! Я создал новый пул приложений (AP) для этого приложения. Я заметил, что .NET CLR Version на предыдущем AP был 2.0. Я не уверен, что это имеет значение, но согласно stackoverflow.com/questions/49185512/ Я могу использовать No managed code для основных приложений, которые Я протестирую в этой AP вместе с теми же изменениями, что и в предыдущей AP.   -  person Westerlund.io    schedule 18.07.2018
comment
@PieterAlberts Не повезло с переносом сайта на его собственную AP = /   -  person Westerlund.io    schedule 19.07.2018
comment
это действительно отстой. Что ж, у меня совсем нет идей ... Если вам действительно нужно решить эту проблему, возможно, добавьте награду +50 за свой вопрос?   -  person Pieter Alberts    schedule 20.07.2018
comment
В этом сообщении они объясняют, что Kestrel процесс завершается, когда IIS пул приложений перезагружается и этот IIS может быть запущен снова, но для Kestrel это происходит только тогда, когда приходит новый запрос (через IIS). Помимо рекомендаций по переносу приложения в планировщик или службу Windows, в качестве быстрого и грязного обходного пути вы можете запланировать CURL или PowerShell скрипт, чтобы сделать веб-запрос на ваш веб-сайт желаемым время как «звонок для пробуждения».   -  person pfx    schedule 25.07.2018


Ответы (5)


Я столкнулся с той же проблемой, когда мое основное приложение ASP.NET переходит в режим ожидания даже с "AlwaysRunning" в качестве режима запуска для пула приложений, для параметра "Preload Enabled" установлено значение true для сайта, а для тайм-аута простоя установлено значение 0. Я понял. для работы, установив модуль инициализации приложения и установка версии .NET CLR на v4.0. Не используйте «Нет управляемого кода», так как это помешает Always Running запускать приложение.

Я написал сообщение в блоге об этом, в котором более подробно объясняются шаги, которые я предпринял, чтобы приложение работало непрерывно.

person Tai Bo    schedule 19.10.2018
comment
Спасибо за ответ, сейчас я внес изменения и тестирую их! - person Westerlund.io; 22.10.2018
comment
установка версии .NET CLR на v4.0 устранила проблему для меня. - person Mohamed Sahbi; 14.08.2020

У них есть документация о том, как настроить работу службы без остановки.

http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html#enables-service-auto-start

По моему опыту (со старыми версиями IIS 7.5, 8.0) он работает, но не для перезагрузки пула приложений / выгрузки домена. Обходной путь для меня заключался в отправке запроса инициализации в событии application_end.

person wolszakp    schedule 26.07.2018
comment
Наконец, мы перешли на хостинг основного приложения в качестве службы Windows, а не приложения IIS, чтобы решить эту проблему с помощью перезапуска приложения. - person Danila Polevshikov; 26.07.2018
comment
В моем случае это было частью веб-приложения, поэтому в конце выше была решена проблема. - person wolszakp; 26.07.2018

Как указано выше - вам необходимо включить автозапуск службы - в дополнение к этому, если вы столкнетесь с несколькими исключениями, я обнаружил, что Rapid Fail Protection отключал пулы приложений в прошлом при использовании HangFire. Так что также стоит отключить (или увеличить до разумных пределов) это в пуле приложений.

person Phil Golding    schedule 26.07.2018

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

Еще одна вещь заключается в том, что, согласно описанию Microsoft на MSDN вариант "AlwaysRunning":

"Указывает, что служба активации процессов Windows (WAS) всегда будет запускать пул приложений. Такое поведение позволяет приложению загружать операционную среду перед обслуживанием любых HTTP-запросов, что сокращает время обработки начальных HTTP-запросов для приложения. "

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

person SammuelMiranda    schedule 26.07.2018

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

RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");

Вышеупомянутого CRON достаточно, чтобы предотвратить переход пула приложений IIS в спящий режим. Я использую RestSharp, чтобы сделать крошечный запрос ping / GET для «Self».

person hubert17    schedule 17.10.2019