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