Windows servisler herhangi bir arayüzü olmadan işletim sisteminde background'da uzun süreli hiç durmaksızın çalışması gereken uygulamalar yaratmak için faydalanabileceğimiz yöntemlerden biridir. Windows servisler herhangi bir manuel start stop işlemi gerektirmeksizin üzerinde çalıştıkları işletim sistemi ile birlikte start-stop olabilecek şekilde konfigüre edilirler.
Windows service şeklinde çalışan projeler oluşturmak için birden fazla yöntem bulunmaktadır ancak open-source geliştirilen Topshelf kütüphanesi kalitesi ve .Net Core uyumluluğuyla oldukça ön plana çıkmakta.
Bu yazıda bir .net core console uygulamasını topshelf kullanarak Windows Service olarak nasıl host edebiliriz bunu inceleyeceğiz.
Topshelf .net framework/.net core kullanılarak geliştirilen console uygulamalarını windows service olarak install ve host etmeye yarayan bir open-source kütüphanedir. Kütüphane service class mimarisi karmaşasından uzak sadece bir kaç class implementasyonu ile console uygulamalarını windows service olarak host etmemize olanak sağlar.
Örnek bir uygulama üzerinden anlatacak olursak;
İlk olarak vs'da NetCoreTopshelf.Sample adında bir .net core console app. oluşturalım.
Sonrasında nuget üzerinden hali hazırda develope branch'i de olsa Topshelf'i proje referanslarına ekleyelim.
Sırada Windows Service Logic bilgisini içeren HelloWorldServiceHost.cs sınıfını aşağıdaki gibi oluşturalım.
public class HelloWorldServiceHost
{
public void Start()
{
Console.WriteLine("Hello World Service Started !!");
}
public void Stop()
{
Console.WriteLine("Hello World Service Stopped !!");
}
}
Uygulama kod kısmı ile ilgili son kısım ise Windows Service configure etmek kaldı. Program.cs içerisindeki Main metodunda aşağıdaki gibi uygulamamızı windows service registration yaparken gerekli olan konfigurasyonları belirtelim.
static void Main(string[] args)
{
HostFactory.Run(hostConfig =>
{
hostConfig.Service<HelloWorldServiceHost>(serviceConfig =>
{
serviceConfig.ConstructUsing(() => new HelloWorldServiceHost());
serviceConfig.WhenStarted(s => s.Start());
serviceConfig.WhenStopped(s => s.Stop());
});
hostConfig.RunAsLocalSystem();
hostConfig.SetServiceName("Hello World Service");
hostConfig.SetDisplayName("Hello World Service Host");
hostConfig.SetDescription("Hello World Service Host using .Net Core and Topshelf.");
Windows service olarak exe install etmemiz gerekmekte ancak .net core uygulamaları default'da executable bir output üretmemekte. Bunu yapabilmemiz için extradan proje csproj dosyasına gidip aşağıdaki gibi .exe çıktısı üretmesini sağlatacak olan RuntimeIdentifier kod satırını ekleyelim.
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Uygulama geliştirmemiz bitti. Tek yapmamız gereken exe'yi service olarak install etmek. Bunun için NetCoreTopshelf.Sample.exe dosyasının bulunduğu path'e gidip aşağıdaki gibi administrator olarak çalıştırdığımız Command Prompt'ta ilgili install komutunu çalıştıralım.
NetCoreTopshelf.Sample.exe install
Uygulamamız windows service olarak çalışmaya başladı. Emin olmak için bilgisayarınızdan Task Manager'a gidip Services tab'ının altında aşağıdaki gibi HelloWorld ismini göreceksinizdir.
Service'i uninstall etmek içinse NetCoreTopshelf.Sample.exe uninstall komutunu çalıştırmanız yeterli.
NetCoreTopshelf.Sample.exe uninstall
Yazının başında da belirtiğimiz gibi windows-service çalışan uygulamalar geliştirmenin çeşitli yolları vardır ancak Topshelf kütüphanesi kullanarak bu uygulamaları geliştirmek oldukça hızlı ve basit bir seçenek olarak karşımıza çıkmakta. Özellikle .Net Core için konuşmak gerekirse bugün itibariyle windows-service olarak çalışabilen self-hosted uygulamalar oluşturmak pek kolay gibi görünmesede Topshelf ile bunu yapabilmek mümkün mümkün.
Source Code