Найти тему

Как сделать и запустить WorkerService .NET 6 на Windows Server

Оглавление

Привет!

Тут беда, я пишу микросервис, который реализует 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 добавить строчку:

-3

В Worker менять ничего не нужно.

Деплой и добавление в Сервисы.

-4

Опубликовать -> 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

В Журнале событий мы можем увидеть успешную установку.

-6


Проблемы.

1. Если мы не установим Microsoft.Extensions.Hosting.WindowsServices и не подключим в Program.cs, то получим ряд вот таких ошибок.

-7
-8
-9

2. Так же нужно установить на машину .NET SDK 6.0+.

3. При удалении сервиса через Powershell, нужно закрыть окно оснастки "Сервис". Иначе сервис будет висеть как не удалённый, а повторное удаление сообщит "Remove-Service: Service 'TestService (TestService)' cannot be removed due to the following error: Указанная служба была отмечена для удаления."

-10

P.S для Lunux системы нужно поставить в nuget другой пакет - Microsoft.Extensions.Hosting.Systemd