Makale Özeti

Her saat başı bir tabloda ki kayıtları loglayan Windows Service yazıyoruz.

Makale

Aslında yapısı cok basitt olan windows servisler(Hizmetler) genelde kullanıcılar tarafın da görülmediği için çok kullanıcı ne işe yaradıklarını pek bilmez. Çalışma mantığı bana otobusleri hatırlatıyor, örneğin biz binsekte binmesekte otobüslere biz binsekte binmesekte onlar sürekli çalışır. Ama işimiz olduğu zaman hemen kullanırız. Windows service de sürekli yada belli tetiklemelerle arka planda calışan arayüzü olmayan yazılımlardır. Erşimleri ve yetkileri çok fazladır. Sistem  performasına, sistemdeki hatalarına, network erişimlerine, veritabanın transactionlarana erişebilirsiniz ve log tutabilirsiniz. Aslında çok masum erişim olarak gözüksede bunlar pek öyle yapılar değil aslında tabi size açıklarından şu an paylaşmayacağım.

Proje için Microsoft Visual Studio 2010 kullanacağız. Windows tagının altında olan Windows Service'i seçiyoruz. Karşımıza çıkan ekranda hiçbir şey olmadığını göreceksiniz. Sebebi windows sevislerinde arayüzü olmadığı için böyle bir ekran var. Toolbox'ı açarsanız Windows Forms toolsun altındakiler genelde bi anlam ifade etmiyor. İş akışımız: MS SQL tablomuzun her saat başı kayıt sayısını logunu tutacagız. Başlangıç olarak bize gerekli olan bir Timer tabi toolbox'taki Windows Forms'a ait olan timer'ı eklersek çalışmayacaktır. Onun için toolbox'a sağ tıklayıp Choose Items diyerek aşağıdaki resimde ki gibi System.Timers'ı toolbox'a ekliyoruz ve projemize de sürükleyip bırakıyoruz. Ardından properties'ten Interval süresini 3600000 yapıyoruz bu da 1 saate denk geliyor

Şimdi toolbox'tan EventLog controlunu  ekledikten sonra Timer'a çift tıklayarak  kod yazmaya geçiryoruz;


 using  System .Data .SqlClient ;
 using  System .ServiceProcess ;
 
 namespace  SQLDataTransfer 
 {
     public  partial  class  Service1  : ServiceBase 
     {
         public  Service1 ()
         {
             InitializeComponent ();
         }
         protected  override  void  OnStart (string [] args)
         {
             if  (!System .Diagnostics .EventLog .SourceExists ("DataTransferLog" ))
                 System .Diagnostics .EventLog 
                     .CreateEventSource ("DataTransferLog" , "DataTransferProcessing" );
             eventLog1 .Source  = "DataTransferLog" ;
             eventLog1 .Log  = "DataTransferProcessing" ;
             eventLog1 .WriteEntry ("Servis Çalışmaya Başladı?" );
             timer1 .Start ();
         }
         protected  override  void  OnStop ()
         {
             eventLog1 .WriteEntry ("Servis Durduruldu" );
         }
         private  void  timer1_Elapsed (object  sender, System .Timers .ElapsedEventArgs  e)
         {
             SqlConnection  con = 
                 new  SqlConnection ("XXXXX" );
             SqlCommand  com = 
                 new  SqlCommand ("select count(*) from tbl_KayitDeneme" , con);
             con.Open ();
             string  KayitAdedi = com.ExecuteScalar ().ToString ();
             con.Close ();
             con.Dispose ();
             com.Dispose ();
             eventLog1 .WriteEntry (
                 string .Format ("{0} Adet Kayıt bulunmaktadır" , KayitAdedi));
         }
     }
 }
 
 


Windows servislerini bilgisayarınıza kurmak için servisimizin Design bölümüne geliyoruz orada aşağıdaki gibi sağ tıkladığımızda yukarıda ki gibi bir menü cıkacaktır burada Add Istaller dediğimizde ise otamatik olarak projemize aşağıda solition explorer de gördüğünüz gibi ProjectInstaller dosyaysı ekleyerek ve üserine seviceInstaller1 ve serviceProcessIstaller1 adlı iki adet control eklemiştir. bizim burada yapmamız gerekenler şunlar;

İlk olarak serviceProcessInstaller1'in propertieslerine gelip Account bölümünü LocalSytem yapıyoruz bunu yapma amacımız bir yere bağlanacak isek yada bir veriye erişecek seçtiğimiz bölümün authentication'u ile erişiyoruz örneğin bir sql server database erişimler kısıtlı ise veya bağlantı için windowsun kullanıcı adı ile bağlanıyorsanız LocalSytem derseniz o database'ye erişiminiz de hata alacsınızdır. Bunun giderilmesi için connection stringiniz de kullanıcı adı ve parolanızı girmeniz gerekecektir. Şimdi serviceIntaller1 controlumuzun propertieslerine gelicek olursak burada da servisimizin adının ne olacağı ve bilgisayarımız acıldığında otamatik mi çalıssın yada manual olarak mı calışsın diye secenekler var bizim ben bunu Automatic yapıyorum. Burada değiştirmemiz diğer bölüm ise ServiceName'dir.

Bu ise windows servislerini açtığımız da göreceğimiz adıdır. Şimdi windows servisimiz tamamdır. Projemizi Build ediyoruz. Şu an projemiz hazır durum da bir tek yüklemesi kaldı. Tabi bunu ister setup proje yaparak kurum dosyasını yapabilirsiniz ama ben manual olarak kuracağım. Bu kurulumda Visual Studio Tolls'un altında olan Visual Studio Command Prompt'u kullanacagız.

Command ekranı bildiğimiz "DOS" gibi çalışır ama tabi kendine has özel komutları var biz burada "cd" komutunu yazıp ardından yaptığımız projenin exe dosyasının olduğu dosya klasorün yolunu yazıyoruz. O dosyanın içine girdikten sonra Yüklemeyi yapacak komudumuz "InstallUtil" komutumuzu yazarak ardından exe dosyasının uzantıı ile tam adını yazıyoruz ardından kendisi yükleme yaparak sonun da completion dedikten  sonra yükleme işlemimiz tamamlanmıştır.


Servisimiz de aşagıdaki gibidir

Olaylarımız da aşağıdaki gibi yeni bir source oluşmuştur. Bunun içerisinden kaydettiğimiz logları okuyabiliriz.