15 Haziran 2017 Perşembe

ServiceController

Service Main Metodu
Service projesi oluşturunca Main metodu olarak şuna benzer bir kod üretilir.
static partial class Program
{
    static void Main(string[] args)
    {
        RunAsService();
    }

    static void RunAsService()
    {
        ServiceBase[] servicesToRun;
        servicesToRun = new ServiceBase[] { new MainService() };
        ServiceBase.Run(servicesToRun);
    }
}
ServiceBase sınıfı verilen servisi başlatır. Bu sınıfın detayları aşağıda. Bazen daha kolay geliştirme yapmak için şöyle kodlar kullanılıyor. Böylece service bir konsol uygulaması gibi geliştirilebiliyor.
static void Main(string[] args)
{
    TestService = new  TestService ();

    #if DEBUG
        TestService.StartWork();
    #else
        System.ServiceProcess.ServiceBase.Run(TestService ); 
    #endif
}
ServiceBase Sınıfı
ServiceBase Sınıfı yazısına taşıdım.

ServiceController Sınıfı
Sınıfı kullanmak için şu satır dahil edilir. Servisi durdurup başlatmak için Local Administrator olmak gerekir.
using System.ServiceProcess.ServiceController
Kullanıcının Local Administrator olup olmadığı şöyle kontrol edilebilir.
net localgroup Administrators
net localgroup Administrators /add user
Constructor
Sınıf şöyle yaratılır.
ServiceController service = new ServiceController(serviceName);
Uzaktaki bir makine için şöyle yaparız.
var sc = new ServiceController("W3SVC", "10.201.58.114");
Start metodu
Şöyle yaparız.
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running); 
Stop metodu
Şöyle yaparız.
sc.Stop();
sc.WaitForStatus(ServiceControllerStatus.Stopped);

Restart İşlemi
Eğer service herhangi bir hata ile karşılaşırsa Windows ayarının yapılması gerekir. Servisimize sağ tıklayıp Properties->Recovery->Restart after failure on first failure ayarı yapılır.
Kod içinde ise Environment.Exit (1) ile çıkılır. Dolayısıyla Windows servisi tekrar başlatır.

sc komutu
Servislerle çalışan kişinin sc komutunu bilmesi gerekir. Komut şöyle bir yapıya sahiptir.
sc [Servername] Command Servicename [Optionname= Optionvalue...]
depend seçeneği
Servisin bağımlı olduğu diğer servisler şöyle tanımlanır
sc [ServerName] config ServiceName depend=servicetoDependOn
Installer Sınıfı
Installer Sınıfı yazısına taşıdım.

ServiceInstaller Sınıfı
ServiceInstaller Sınıfı yazısına taşıdım.

Hiç yorum yok:

Yorum Gönder