У меня есть WebAPI, написанный на C# и размещенный в Windows Server Datacenter 2019. API должен быть всегда запущен и готов, и его нельзя удалять!
Если я остановил ApplicationPool и запустил его снова, API не инициализируется, пока я не отправлю запрос или не открою URL-адрес API, после чего он продолжит работать.
Проблема в том, что у меня есть ScopedService, и он должен выполнять некоторую работу в фоновом режиме, а перезапустив AppPool или IIS, он останавливает задания до тех пор, пока не придет запрос.
Я перепробовал много идей, но они не сработали.
Я установил AppPool на AlwaysRunning и тайм-аут простоя равный 0, но это тоже не помогло!
Я также попытался написать GetMethod для пробуждения API и в web.config я добавил =>
<applicationInitialization doAppInitAfterRestart = "true" skipManagedModules = "true">
<add initializationPage = "api/app_start" />
</applicationInitialization>`
Но тоже не сработало!
Приложение полностью удалено и просыпается только при вызове метода или URL-адреса.
Единственный метод, который был реализован, - это автоматический вызов API с помощью Shell-Script после перезапуска IIS с помощью Windows Taskplaner, но это всего лишь обходной путь, и он мне не понравился.
Есть ли у кого-нибудь идеи, как это сделать чистым? и автоматически инициализировать/пробуждать приложение, если IIS перезапускается или AppPool перезапускается?
@J.Memisevic проклятие!
Да, предварительная загрузка включена - @J.Memisevic
какую версию .net вы используете?
@J.Memisevic Я использую .Net 8





В документации по установке, которую мы предоставляем пользователям, размещающим наше приложение ASP.NET Core 6, указаны все предварительные условия и шаги, необходимые для запуска приложения сразу после запуска или сброса пула приложений. Я перефразирую их здесь:
Предварительные условия виртуальной машины
Установленные роли и службы (из диспетчера серверов):
Конфигурация IIS
Пулы приложений
Это можно сделать как аргументы командной строки для %systemroot%\system32\inetsrv\appcmd.exe:
set apppool "AppPoolName" /autostart:true /startMode:"AlwaysRunning" /processModel.idleTimeout:"00:00:00"
set apppool "AppPoolName" /-recycling.periodicRestart.schedule
set apppool "AppPoolName" /+recycling.periodicRestart.schedule.[value='04:00:00']
Приложения
При добавлении сайта убедитесь, что установлен флажок «Запустить сайт немедленно»:
Или из командной строки:
set site "ApplicationName" /applicationDefaults.preloadEnabled:true
Никаких дополнительных действий в web.config или где-либо еще не требуется.
Он уже включен, но тоже не сработал!
@M.Fakhoury Единственное, что я могу себе представить, это то, что на сервере должна быть установлена функция инициализации приложений. Недостаточно просто иметь это в web.config.
Все установлено и я попробовал поставить и это => <applicationInitialization doAppInitAfterRestart = "true"skipManagedModules = "true" remapManagedRequestsTo = "swagger/index.html" > <add InitializationPage = "swagger/index.html" /> </applicationInitialization > но это не сработало, и API не хочет работать, он показывает мне ошибку => Ошибка: превышено maxRedirects. Вероятно, застрял в цикле перенаправления. Если я использую инициализацию приложения - @Emperor Это
@M.Fakhoury Я обновил свой ответ с учетом всех известных мне предварительных условий. Если это не работает для вас, происходит что-то другое.
Большое спасибо. Я сделал эти шаги, и теперь все работает нормально :)
Включена ли предварительная загрузка в расширенных настройках вашего сайта?