Home Contact RSS

Makale 13: Remoting Uygulamalarında Hata Ayıklanması ve Dağıtım

GiriÅŸ

“Uygulama çok yavaÅŸ çalışıyor!” cümlesi bir developer’ın en son duymak isteyeceÄŸi cümledir. Bir ÅŸekilde duyduysak da artık uykusuz gecelere hoÅŸgeldin demenin vakti gelmiÅŸ demek oluyor.

Fakat uykusuz gecelerin sebebi sanıldığı gibi yavaÅŸlıkların sebebinin bulunması deÄŸil, optimizasyonların yazılması. Peki nasıl oluyor da yavaÅŸlıkların ve performans kayıplarının bulunması bu kadar olabiliyor diye düşünenler için cevap çok net, Windows’un sunmuÅŸ olduÄŸu “Performance Monitor”.

Uygulamalar bazen sadece yoÄŸun olarak çalıştıkları durumlarda, örneÄŸin 10 kullanıcının aynı anda baÄŸlı olması, çeÅŸitli sorunlar çıkartabilirler. Bu durumda uygulamayı debug edebilmek için tek ÅŸansınız çalışır halde, uygulamanın client’lara sunduÄŸu servisleri aksatmadan duruma müdahale etmektir. Remoting uygulamalarının debugging iÅŸlemi bu sebeplerden dolayı çeÅŸitli sorunlara neden olabilmektedir. Fakat uygun condition’lar oluÅŸturulduÄŸunda bu sorun rahatlıkla aşılabilmektedir.

Remoting’in getirmiÅŸ olduÄŸu en önemli avantajın farklı environment’lar kullanılarak host edilebileceÄŸi olduÄŸundan bahsetmiÅŸtik. ÖrneÄŸin ASP.NET uygulamaları, Console Application’lar ve ya NT Service’leri. Tüm bu opsiyonları karşılaÅŸtırarak en uygun seçeneÄŸi bulmanız gerçekten önemli bir konu.

Bu chapter sonunda aşağıdaki konular hakkında bilgi sahibi olacağız;

  • Performance Monitor’ü kullanımı,
  • Remoting uygulamalarının debug edilmesi,
  • Remoting server’ının host edilmesi.

Host and Deploy a Remoting Application

.NET Framework remoting uygulamarının aşağıdaki seçenekler üzerinde host edilmesine imkan tanır.

  • IIS
  • Windows Service (NT Service)
  • Windows Application
  • Console Application

IIS

Host seçeneÄŸinin Internet Information Services (IIS) olarak yapılması IIS’in kendi içerisinde bulunan güvenlik seçeneklerinin (SSL, certificates, etc.) uygulamaya herhangi bir ek kodlama gerektirmeden eklenebilmesini saÄŸladığı için avantajlıdır. IIS seçeneÄŸi seçildiÄŸinde channel’ın üzerinde çalışacağı protocol yalnızca HTTP olabilir.

Windows Service

Hata oluşması durumunda Windows servislerinin sahip olduğu otomatik tekrar başlama özelliği sayesinde çeşitli hataların oluşması durumlarına karşı en avantajlı seçenektir. Uygun ayarların yapılması durumunda sistemin başlaması sonrasında, herhangi bir kullanıcının logon olmasına gerek olmadan, otomatik olarak çalışma özelliğine sahiptir.

Windows Service’leri System.ServiceProcess.ServiceBase class’ından inherit edilerek yazılmaları gerekmektedir. OnStart ve OnStop method’larının override edilmesi durumunda servisin baÅŸlatılmasında ve durdurulmasında yapılacak olan iÅŸlemler kolaylıkla develop edilebilir.

Windows Application

Uygulamanın çeÅŸitli parametrelere göre test edilmesi gibi durumlar sözkonusu olduÄŸunda sunduÄŸu görsel arabirim çeÅŸitli avantajlar getirebilmektedir. Uygulamanın kapanmasına sebep olacak bir exception throw edilmesi durumunda otomatik tekrar baÅŸlama ÅŸansı olmadığı için production environment’ta kullanılmamalıdırlar. Fakat Windows Application’ları genellikle Remoting server yerine Remoting client development’ında kullanılırlar.

Console Application

Test aÅŸamalarında kolay olarak çalıştırılabilmesi ve kolay debug edilebilmesi sebebiyle kullanılabilir. Remoting server’ları genel olarak bu uygulama tipinde develop edildikten sonra Windows Service uygulaması haline convert edilirler.

Örnek Windows Service Uygulaması

1.     Visual Studio’yu çalıştırın.

2.     File > New menüleri altındaki Project seçeneğini seçin.

3.     Visual C# > Windows seçeneği altındaki Windows Service proje tipini seçin.

4.     Name property’sine MyFirstWindowsService yazın.

5.     Location property’sine projeyi oluÅŸturmak istediÄŸiniz klasörün path’ini yazın ve ya Browse seçeneÄŸini kullanarak path’i gösterin.

6.     Solution Name property’si otomatik olarak MyFirstWindowsService ÅŸeklinde deÄŸiÅŸir, eÄŸer deÄŸiÅŸmemiÅŸ ise bu property’ye de MyFirstWindowsService yazın.

Bu işlemler sonrasında New Project ekranı aşağıdaki şekilde görünür:

NOT

Location property’sinde yazmakta olan “C:\Path\to\Your\Project” path’i seçmiÅŸ olduÄŸunuz path’e göre deÄŸiÅŸiklik gösterektir.

7.     OK butonuna tıklayın.

8.     Karşınıza “Service1.cs” isimli bir dosya açık olacak çıkar.

9.     Bu dosyanın ismini Solution Explorer penceresi yardımı ile “MyFirstService.cs” olarak deÄŸiÅŸtirin.

10.  Visual Studio “Service1.cs” dosyasının ismini deÄŸiÅŸtirdikten sonra bu dosya içerisindeki “Service1″ isimli class’ın ismi otomatik olarak “MyFirstService” ÅŸeklinde deÄŸiÅŸir. DeÄŸiÅŸmemesi durumunda class’ın ismini “MyFirstService” olarak deÄŸiÅŸtirin.

11.  Solution Explorer penceresindeki References klasörüne saÄŸ tıklayarak “Add Reference” seçeneÄŸine tıklayın.

12.  Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “.NET” tab’ındaki “System.Runtime.Remoting” assembly’sini seçin ve OK butonuna tıklayın.

13.  Solution Explorer penceresindeki References klasörüne saÄŸ tıklayarak “Add Reference” seçeneÄŸine tıklayın.

14.  Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “Browse” tab’ını seçerek “MyFirstRemotableType” project’inin bulunduÄŸu klasöre gidin.

15.  Bu klasör içerisinde de sırasıyla “bin” ve “Debug” klasörlerine girerek “MyFirstRemotableType.dll” isimli assembly’yi seçin ve OK butonuna tıklayın.

16.  Project’e MyRemotableType.cs isminde yeni bir Class dosyası ekleyin.

17.  MyRemotableType.cs dosyasının içeriÄŸini daha önce develop etmiÅŸ olduÄŸumuz MyFirstRemotingServer projesindeki ile aynı fakat tek farkı namespace bilgisi “MyFirstWindowsService” olarak, aÅŸağıdaki ÅŸekilde yazın:

MyFirstService.cs dosyasına import edilecek namespace’lerin import ediliÅŸleri

using System;
using MyFirstRemotableType;
namespace MyFirstWindowsService
{
    public class MyRemotableType : MarshalByRefObject, IMyRemotableType
    {
        int requestCount;

        public MyRemotableType()
        {
            this.requestCount = 0;
        }

        public DateTime GetServerDateTime()
        {
            requestCount++;
            return System.DateTime.Now;
        }

        public int RequestCount()
        {
            return requestCount;
        }
    }
}

18.  MyFirstService.cs isimli dosyaya saÄŸ tıklayarak “View Code” seçeneÄŸine tıklayın. Karşınıza servisin kodları çıkar.

19.  MyFirstService.cs dosyası içerisinde aÅŸağıdaki namespace’leri import edin:

MyFirstService.cs dosyasına import edilecek namespace’lerin import ediliÅŸleri

using System;
using System.Collections;
using System.ServiceProcess;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using MyFirstRemotableType;

20.  OnStart method’unu aÅŸağıdaki ÅŸekilde yazın:

OnStart method’u implementation’ı

protected override void OnStart(string[] args)
{
    IDictionary channelProperties = new Hashtable();
    channelProperties.Add("name", "MyTcpChannelName");
    channelProperties.Add("port", "4444");
    channelProperties.Add("priority", "1");

    TcpChannel tcpChannel = new TcpChannel(channelProperties, new BinaryClientFormatterSinkProvider(), new BinaryServerFormatterSinkProvider());

    ChannelServices.RegisterChannel(tcpChannel, false);

    RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemotableType), "MyRemotableType.rem", WellKnownObjectMode.Singleton);
}

21.  OnStop method’u içeriÄŸinde herhangi bir deÄŸiÅŸiklik gerekmemektedir.

22.  MyFirstService.cs dosyasına saÄŸ tıklayarak “View Designer” seçeneÄŸine tıklayın.

23.  Karşınıza gelen ekranda saÄŸ tıklayarak “Add Installer” seçeneÄŸine tıklayın.

24.  Ekranda iki yeni object belirir.

25.  serviceProcessInstaller1 ismindeki object’in type’ı System.ServiceProcess.ServiceProcessInstaller class’ıdır ve Account özelliÄŸi sayesinde servisin hangi user account’unu kullanarak çalıştırılacağı belirlenebilir. Bu özellikler User, LocalService, LocalSystem ve ya NetworkService seçeneklerinden birisi olabilir.

26.  serviceInstaller1 ismindeki object’in type’ı System.ServiceProcess.ServiceInstaller class’ıdır ve servisin Description, DisplayName, StartType, ServiceName gibi özelliklerine sahiptir.

27.  serviceProcessInstaller1 object’inin Account özelliÄŸini “LocalService” olarak deÄŸiÅŸtirin.

28.  serviceInstaller1 object’inin Description özelliÄŸini “This service hosts my first remoting server” olarak deÄŸiÅŸtirin.

29.  serviceInstaller1 object’inin DisplayName özelliÄŸini “My First Remoting Server” olarak deÄŸiÅŸtirin.

30.  serviceInstaller1 object’inin StartType özelliÄŸini “Automatic” olarak deÄŸiÅŸtirin.

31.  serviceInstaller1 object’inin ServiceName özelliÄŸini “MyFirstRemotingServer” olarak deÄŸiÅŸtirin.

32.  Project’i “Build” menüsünü kullanarak build edin.

33.  Visual Studio’yu kapatın.

34.  Visual Studio 2005 Command Prompt’u açın.

35.  InstallUtil.exe C:\Path\to\Your\Project\bin\Debug\MyFirstWindowsService.exe komutunu yazarak çalıştırın.

NOT

1.    InstallUtil.exe uygulaması Windows Service’lerinin kurulması iÅŸlemini gerçekleÅŸtirmektedir.

2.    InstallUtil.exe -u parametresi ile kullanıldığında servisi uninstall etmektedir.

3.    Komut içerisinde verilen C:\Path\to\Your\Project path’i project’inizi oluÅŸturduÄŸunuz klasöre uygun olarak deÄŸiÅŸtirilmelidir.

36.  Komut çalıştırıldığında karşınıza servisin hangi user account’unu kullanarak çalıştırılmak istendiÄŸi sorusu sorulacaktır. Buraya uygun bilgileri girin.

37.  Bilgileri girip OK butonuna tıklayın.

38.  BaÅŸarılı bir kurulum sonrasında command prompt ÅŸu mesajı gösterecektir: “The Commit phase completed successfully. The transacted install has completed.

39.  Control Panel’e gidin.

40.  Administrative Tools klasörüne girin.

41.  Services shortcut’ına çift tıklayın.

42.  Service listesi içerisinde My First Remoting Server isimli service’in yer aldığını göreceksiniz.

43.  Service’i çalıştırmak için saÄŸ tıklayın ve Start seçeneÄŸine tıklayın.

44.  Service başlatılacaktır.

45.  MyFirstRemotingClient isimli console application’ını çalıştırın ve bu iÅŸlem sırasında MyFirstRemotingServer isimli console application’ının çalışmadığından emin olun. Bunun sebebi her iki uygulamanın da 4444. portu kullanıyor olması ve ikisinin aynı anda çalışamayacak olmasıdır.

46.  MyFirstRemotingServer uygulaması çalışmıyor olduÄŸu halde Remoting client’ı çalışacaktır.

47.  My First Remoting Server isimli service’i stop edin.

48.  MyFirstRemotingClient isimli console application’ını tekrar çalıştırın.

49.  Windows servisini durdurduÄŸumuz durumda MyFirstRemotingClient isimli console application’ının çalışmadığını gördünüz.

Leave a Comment