В .NET Core 3.0 мы представляем новый тип шаблона приложения под названием Worker Service. Этот шаблон предназначен для того, чтобы дать вам отправную точку для написания долго-работающих сервисов в .NET Core. В этом пошаговом руководстве мы создадим worker и запустим его в качестве службы Windows.




Создание worker


Примечание. В наших предварительных версиях шаблон worker находится в том же меню, что и веб-шаблоны. Это изменится в будущем выпуске. Мы намерены разместить шаблон Worker Service непосредственно в мастере создания нового проекта.


Создание Worker в Visual Studio


image


image


image


Создание Worker в командной строке


Выполните dotnet new worker


image


Запуск в виде службы Windows


Чтобы запустить в качестве службы Windows, нам нужно, чтобы наш worker видел сигналы запуска и остановки от типа ServiceBase .NET, который связывает системы Windows Service с приложениями .NET. Для этого нужно:


Добавить пакет NuGet Microsoft.Extensions.Hosting.WindowsServices


image


Добавить вызов 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.


Во-вторых, он настраивает ваш хост на использование ServiceBaseLifetimeServiceBaseLifetime работает с 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

Например:


image


Примечание о безопасности: Эта команда запускает службу как локальную систему, которая не является тем, что нужно. Вместо этого вы должны создать 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:


  1. Переименуем UseWindowsServiceBaseLifetime на UseWindowsService
  2. Добавим автоматическую и улучшенную интеграцию с журналом событий при запуске в качестве службы Windows.

Заключение


Мы надеемся, что вы опробуете наш новый шаблон и хотим узнать, как он работает. Вы можете отправить любые сообщения об ошибках или предложения здесь: https://github.com/aspnet/AspNetCore/issues/new/choose


Avatar
Glenn Condron

Комментарии (1)


  1. fedorro
    03.04.2019 11:20

    Интересно, но перевод хромает. Мне кажется не хватает плашки как на MSDN: «Эта статья переведена с помощью средств машинного перевода.».