В .NET Core 3.0 мы представляем новый тип шаблона приложения под названием Worker Service. Этот шаблон предназначен для того, чтобы дать вам отправную точку для написания долго-работающих сервисов в .NET Core. В этом пошаговом руководстве мы создадим worker и запустим его в качестве службы Windows.
Создание worker
Примечание. В наших предварительных версиях шаблон worker находится в том же меню, что и веб-шаблоны. Это изменится в будущем выпуске. Мы намерены разместить шаблон Worker Service непосредственно в мастере создания нового проекта.
Создание Worker в Visual Studio
Создание Worker в командной строке
Выполните dotnet new worker
Запуск в виде службы Windows
Чтобы запустить в качестве службы Windows, нам нужно, чтобы наш worker видел сигналы запуска и остановки от типа ServiceBase
.NET, который связывает системы Windows Service с приложениями .NET. Для этого нужно:
Добавить пакет NuGet Microsoft.Extensions.Hosting.WindowsServices
Добавить вызов UseServiceBaseLifetime
к HostBuilder
в Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceBaseLifetime()
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
});
}
Этот метод делает несколько вещей. Во-первых, он проверяет, действительно ли приложение работает в качестве службы Windows, если это не так, то он выполняет noops, что делает этот метод безопасным для вызова при локальном запуске или в качестве службы Windows.
Во-вторых, он настраивает ваш хост на использование ServiceBaseLifetime
. ServiceBaseLifetime
работает с ServiceBase
чтобы помочь контролировать время жизни вашего приложения при запуске в качестве службы Windows. Это переопределяет стандартный ConsoleLifetime
который обрабатывает такие сигналы, как CTL + C.
Установка Worker
Как только мы получили worker использовав ServiceBaseLifetime
нам нужно установить его:
Во-первых, давайте опубликуем приложение. Мы установим Службу Windows in-place, что означает, что исполняемый файл будет заблокирован при каждом запуске службы. Публикация — это хороший способ убедиться, что все файлы, необходимые для запуска службы, находятся в одном месте и готовы к установке.
dotnet publish -o c:\code\workerpub
Далее можно использовать sc utility в командной строке администратора
sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
Например:
Примечание о безопасности: Эта команда запускает службу как локальную систему, которая не является тем, что нужно. Вместо этого вы должны создать service account и запустить службу Windows в качестве этой учетной записи. Мы не будем говорить об этом здесь, но здесь есть некоторая документация по ASP.NET: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-2.2
Логирование
У системы логирования есть сервис «Event Log», который может отправлять сообщения логов непосредственно в журнал событий Windows. Чтобы войти в журнал событий, вы можете добавить Microsoft.Extensions.Logging.EventLog
пакет, а затем изменить ваш Program.cs
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(loggerFactory => loggerFactory.AddEventLog())
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
});
Дальнейшая работа
В следующих предварительных версиях мы планируем улучшить использование Workers с Windows Services:
- Переименуем UseWindowsServiceBaseLifetime на UseWindowsService
- Добавим автоматическую и улучшенную интеграцию с журналом событий при запуске в качестве службы Windows.
Заключение
Мы надеемся, что вы опробуете наш новый шаблон и хотим узнать, как он работает. Вы можете отправить любые сообщения об ошибках или предложения здесь: https://github.com/aspnet/AspNetCore/issues/new/choose
fedorro
Интересно, но перевод хромает. Мне кажется не хватает плашки как на MSDN: «Эта статья переведена с помощью средств машинного перевода.».