Привет!
Тут беда, я пишу микросервис, который реализует Worker Services на .NET 6. И по ходу реализации чуть не сошел с ума, разобравшись что к чему.
Документация.
Если в поисковик вбить Worker Server .NET, то первое что Вы найдете - это документацию на ASP. Провалившись в нее Вы ничего не поймете, т.к Worker Service бывают трех видов и потеряете время.
Упрощаю Вам задачу:
1. ASP.NET Core - Это фоновые "демоны" для ASP бекенда.
2. .NET Framework - Только для платформы Windows.
3. .NET 6 - Для версии 2.1, 2.2, 3.0, 3.1, 5, 6. Работает только Async. (то что нас и интересует).
Быстрый старт и краткий обзор.
По умолчанию при старте на .NET 6 создается проект с двумя файлами:
1. Program.cs - Внутри файла создается объект типа IHost, в нем регистрируется новые объекты внутри .ConfigureServices.
Это пригодится для DI.
Новые объекты для DI регистрируются в service через AddSingleton. AddScoped - тут не работает .
2. Worker.cs - в нем реализуется интерфейс BackgroundService, благодаря которому можно запустить StartAsync, ExecuteAsync, StopAsync. Внутри них уже реализовывать код логики нашей программы, который хотим.
Реализации в 2 файла напоминает старый ASP.NET 5.
Если использовать StartAsync и для RabbitMQ использовать MassTransin - то последний не взлетит до конца.
StopAsync - не работает. Такая же проблема на ASP. NET реализации. Сам метод вызывается, код отрабатывает и уходит обратно в ExecuteAsync.
Для успешного старта сервиса на WIndows систему, нужно до установить пакет Microsoft.Extensions.Hosting.WindowsServices, через nuget.
Обязательно в Program.cs добавить строчку:
В Worker менять ничего не нужно.
Деплой и добавление в Сервисы.
Опубликовать -> Folder -> Уточняем среду где будет выполнятся сервис. x64, arm и т.д. -> Опубликовать.
Далее работам с Powershell.
Документация по добавлению сервиса (но команда добавления сервиса в нем не верная).
1. Добавляем новый сервис:
New-Service -Name "TestService" -BinaryPathName "<путь до файла>\win-x64\TestService.exe" -StartupType Automatic
Расширенная альтернатива:
New-Service -Name "TestService" -BinaryPathName "D:\NewTemp\win-x64\TestService.exe" -DisplayName ″TestService″ -Description ″Test build service″) -StartupType Automatic
В документации есть Свойства:
DisplayName - Имя отображаемое в оснастке Служба.
Description - Описание.
StartupType - Способ запуска сервиса (Automatic, Manual, Disabled и т.д.)
2. Стартуем сервис:
Start-Service -Name "TestService"
3. Проверяем статус
Get-Service -Name "TestService"
Удаление сервиса:
Get-Service -Name "TestService" | Remove-Service
В Журнале событий мы можем увидеть успешную установку.
Проблемы.
1. Если мы не установим Microsoft.Extensions.Hosting.WindowsServices и не подключим в Program.cs, то получим ряд вот таких ошибок.
2. Так же нужно установить на машину .NET SDK 6.0+.
3. При удалении сервиса через Powershell, нужно закрыть окно оснастки "Сервис". Иначе сервис будет висеть как не удалённый, а повторное удаление сообщит "Remove-Service: Service 'TestService (TestService)' cannot be removed due to the following error: Указанная служба была отмечена для удаления."
P.S для Lunux системы нужно поставить в nuget другой пакет - Microsoft.Extensions.Hosting.Systemd