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.