Все, кто сталкивались с разработкой служб для операционной системы 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 | using Topshelf; |
Всю магию делает метод 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" |