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.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.