Home Contact RSS

Makale 1: Bir sunucu uygulamasının oluşturulması ve yapılandırılması

GiriÅŸ

Geliştirdiğimiz uygulamaların birbirleri ile iletişime neden ihtiyaç duyacakları, uygulamaların birbirleri ile iletişim kurabilmek için hangi opsiyonlara sahip oldukları gibi soruların üzerinde yoğunlaşacağımız bu bölümde aynı zamanda uygulamalarımızı .NET Remoting kullanabilmeleri için nasıl configure edebileceğimizi ve configuration parametrelerinin neler olduğunu detaylı bir şekilde inceleyeceğiz.

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

  • Application Domain oluÅŸturabilecek ve bu application domain içerisinde bir uygulama çalıştırabileceÄŸiz.
  • Remotable Type’ların nasıl oluÅŸturulacağını bileceÄŸiz.
  • Remoting server’ları ve Remoting client’larının configuration parametrelerini ve hangi durumlarda hangi tercihleri yapmamız gerektiÄŸi konusunda bilgi sahibi olacağız.
  • Remoting server’ı olarak çalışan bir uygulamayı programmatic olarak configure edebileceÄŸiz.
  • Remoting server’ı olarak çalışan bir uygulamayı configuration file’ı kullanarak configure edebileceÄŸiz.
  • Remoting server’ı olarak çalışan bir uygulamayı nasıl build edip çalıştıracağımızı bileceÄŸiz.

Remotable Type OluÅŸturmak

Remotable olarak tanımlanmış object’ler distributed application environment’ında, yani farklı application domain’leri arasında yapılacak olan remoting iÅŸlemleri sırasında kullanılabilecek olan object’lerdir.

Bu object’ler iki ÅŸekilde tanımlanabilir;

  • Marshal-by-value object’ler
  • Marshal-by-reference object’ler

Marshal-by-value Object’ler

Marshal-by-value object’ler server tarafında oluÅŸturulan, sonrasında client’a gönderilen ve bu iÅŸlemden sonra server ile ilgili tüm iliÅŸiÄŸi kesilen object’lerdir. Bu tip object’lerin kullanılması network trafiÄŸini ileriki süreçler (object’in üzerindeki methodların çalıştırılması, vs.) için network trafiÄŸinin kullanılmaması gibi sebepler yüzünden avantajlı olsa da, object’in client tarafına ilk alınışı sırasında network trafiÄŸini topluca kullanacağı unutulmamalıdır.

Bir class’ın Marshal-by-value olarak tanımlanabilmesi için class’ın System.SerializableAttribute attribute’u ile iÅŸaretlenmiÅŸ olması ve ya class’ın System.Runtime.Serialization.ISerializable interface’ini implement etmesi gerekmektedir. Bu iki yöntemden birisi seçilerek ilgili class’tan create edilecek olan object’lerin Marshal-by-value ÅŸeklinde çalışmaları saÄŸlanabilir.

Marshal-by-value Object Oluşturulması

[System.Serializable()
public class MarshalByValue
{
}

Marshal-by-reference Object’ler

Marshal-by-reference object’ler server üzerinde yer alan, client tarafında ise sadece referansları tutulan object’lerdir. Bu object’ler üzerindeki herhangi bir iÅŸlem yapılmak istendiÄŸinde asıl iÅŸlem server üzerinde yapılacaktır ve eÄŸer iÅŸlem bir cevap döndürecekse bu cevap yine referans olarak geri dönecektir. Remotable Type oluÅŸturulurken Marshal-by-value yerine Marshal-by-reference kullanılması, object’in server üzerinde iÅŸlem yapmasını gerektirecek durumlarda mecburidir. Ayrıca object’in size olarak büyük olması gibi durumlarda da tüm object’in her seferinde network üzerinden taşınması gerekliliÄŸini ortadan kaldırdığı için Marshal-by-reference tercih edilmelidir.

Bir class’ın Marshal-by-reference olarak tanımlanabilmesi için class’ın System.MarshalByRefObject class’ından türetilmiÅŸ olması gerekmektedir ve sadece bu iÅŸlemin yapılması class’ı Marshal-by-reference çalıştırmak için yeterlidir.

Marshal-by-reference Object Oluşturulması

public class MarshalByReference : System.MarshalByRefObject
{
}

Sunucu Uygulaması Domain’i OluÅŸturmak

.NET üzerinde geliÅŸtirdiÄŸimiz her uygulama, özel bir kod yazmamanız durumunda, kendisine özel bir application domain (AppDomain) tarafından izole edilir. AppDomain, farklı AppDomain’ler içerisinde bulunan uygulamaların birbirlerinin kodlarına müdahale edememeleri, yani gerekli güvenlik ÅŸartlarının yerine getirilmesi konusunda görevlidir ve tek cümleyle “Application domain’leri .NET Framework üzerinde geliÅŸtirilen uygulamalarda yer alan ve execute edilebilecek en küçük parçadır” ÅŸeklinde tanımlanabilir. AppDomain gibi manage edilen bir environment içerisinde çalışan .NET uygulamalarına “Managed Code” denmesinin sebebi tam olarak budur. Normal olarak her uygulama tek bir AppDomain içerisinde çalışır fakat tek bir uygulamanın içerisinde birden fazla AppDomain kullanılabilmesi de mümkündür. .NET Remoting’in görevi ise farklı AppDomain’ler içerisinde izole edilmiÅŸ olarak çalışan uygulamaların arasındaki iletiÅŸimi saÄŸlamaktır.

AppDomain class’ı System namespace’i içerisinde yer almaktadır ve sealed olarak tanımlanmıştır. Yani AppDomain class’ı yeniden create edilemez. Yeni bir AppDomain object’i oluÅŸturmak için AppDomain class’ının static olarak tanımlanmış CreateDomain method’u kullanılmalıdır.

Application Domain Oluşturulması

Console.WriteLine("SimpleConsoleApplication.exe will be executed now...");
AppDomain applicationDomain = AppDomain.CreateDomain("myAppDomain");
applicationDomain.ExecuteAssembly(@"C:SimpleConsoleApplication.exe");
AppDomain.Unload(applicationDomain);
Console.WriteLine("SimpleConsoleApplication.exe has been executed successfully...");
Console.WriteLine("Press enter to exit...");
Console.ReadLine();

Bu örnekteki kodun çalıştırılması durumunda uygulama “myAppDomain” olarak isimlendirdiÄŸimiz AppDomain object’ini create edecek ve oluÅŸturulan yeni AppDomain içerisinde “C” dizininde bulunan “SimpleConsoleApplication.exe” isimli uygulamayı çalıştıracaktır. Örnek içerisinde dikkat edilmesi gereken noktalardan birisi de AppDomain.Unload(applicationDomain); satırıdır. Bu satır, gerekli olduÄŸu durumlarda AppDomain object’lerinin unload edilebileceÄŸini göstermek için eklenmiÅŸtir.

Bir uygulamayı farklı bir AppDomain üzerinde çalıştırmanın bize saÄŸladığı en büyük avantajlar yeni AppDomain üzerinde çalışan uygulamada bir hata alınması durumunda bu hatanın asıl AppDomain’i etkilemeyecek olması ve yeni oluÅŸturulan AppDomain ve içerisindeki tüm object’lerin gerekli olduÄŸu durumda AppDomain class’ının Unload method’u ile dispose edilebilecek olmasıdır.

Birden fazla application domain kullanmanın avantajlarını kısaca sıralayalım;

Bir application domain içerisinde herhangi bir exception alınması durumunda bu diÄŸer application domain’lerini etkilemeyecektir.

  • Server ve Client arasındaki iletiÅŸim sadece bizim belirleyeceÄŸimiz iÅŸlemler üzerinden yürütülebileceÄŸi için güvenlik sorunları en aza indirgenecektir.
  • Programın sürekli çalışabilirliÄŸi artmış olacaktır.
  • Application domain’lerinden herhangi birisinin tamamı ile dispose edilmesi mümkün olduÄŸundan, herhangi bir iÅŸlemin durdurulması için tüm process’in, yani tüm uygulamanın, durdurulması gerekmeyecektir.

Leave a Comment