Разрабатываем Windows-службы с помощью TopShelf

Все, кто сталкивались с разработкой служб для операционной системы Windows, отмечали трудность отладки подобного ПО. Трудности старта разработки кода решаются шаблонами Visual Studio для Windows-служб, но вот сама отладка – очень неудобная. Приходится подключаться к запущеному процессу через Debug –> Attach to Process… , выбирать процесс, ставить точку останова и т.д. Но всё изменилось когда появился TopShelf. Этот фреймворк (а именно так они себя величают) позволяет разрабатывать и отлаживать Windows-службы как обычные консольные приложения!

Рассмотрим как разрабатывать Windows-службы с помощью TopShelf.

Установить TopShelf в ваш проект можно через менеджер пакетов NuGet:

1
nuget Install-Package Topshelf

Посмотреть исходный код фреймворка TopShelf можно на GitHub

Основной класс (в нашем случае AuthApiService) должен содержать методы public void Start() и public void Stop(), которые используются TopShelf при старте и остановке службы. В моём случае файл Program.cs же будет иметь следующий вид:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using Topshelf;

class Program
{
private const string ServiceName = "Authentication and WebAPI service";

static void Main(string[] args)
{
HostFactory.Run(config =>
{
config.StartAutomatically(); // startup type
config.EnableShutdown();
config.Service<AuthApiService>(service =>
{
service.ConstructUsing(svc => new AuthApiService());
service.WhenStarted(svc => svc.Start());
service.WhenStopped(svc => svc.Stop());
});
config.RunAsLocalSystem();
config.SetServiceName(ServiceName);
config.SetDisplayName(ServiceName);
config.SetDescription(ServiceName);
config.EnableServiceRecovery(service =>
{
service.OnCrashOnly();
service.RestartService(delayInMinutes: 0); // first failure
service.RestartService(delayInMinutes: 0); // second failure
service.RestartService(delayInMinutes: 1); // subsequent failures
service.SetResetPeriod(days: 1); // reset period for restart options
});
});
}
}

Всю магию делает метод HostFactory.Run. В нём указывается класс основного тела службы с методами Start и Stop, задаётся имя службы и описание в менеджере служб Windows (Services). TopShelf позволяет провести почти такую же настройку режима работы службы, которую выполняет менеджер служб Windows, в частности задать из под кого будет запускаться служба RunAsLocalSystem или задать параметры перезапуска в случае падения службы с помощью EnableServiceRecovery.

Установить службу в операционную систему Windows можно из командной строки, запущенной от Администратора, прямо в папке где находится служба командой:

1
AuthApiService.exe install

Удалить службу можно командой:

1
AuthApiService.exe uninstall

Всю магию установки и настройки службы берёт на себя Topshelf!

Службу можно установить и самостоятельно, но тогда настройки из раздела EnableServiceRecovery применены не будут.

1
sc create "Authentication and WebAPI service" binPath="<путь_к_службе>\AuthService.exe"

Удалить службу самостоятельно можно командой:

1
sc delete "Authentication and WebAPI service"