Makale 4: Sunucu Uygulamalarının Çalışma Zamanında Yapılandırılması
Daha önceki remoting uygulamaları makalelerimizden sonra sonra bir Remoting server’ının programatik olarak nasıl yapılandırılabileceğini görelim.
İlk olarak Remoting server’ımız üzerinde kullanılacak ve aşağıda listelenen method’lara sahip olan object’imizi (remotable type) oluşturalım.
- Default constructer. Console object’ine object’in construct olduğuna dair mesaj yazacaktır.
- Finalizer. Console object’ine object’in descruct edildiğine dair mesaj yazacaktır.
- GetExecutionCount. Hiçbir parametresi bulunmamaktadır ve executionCount değişkenini her seferinde 1 değer arttırarak geri döndürmekle görevlidir.
Listelenen method’lara göre kodumuz aşağıdaki gibi olmalıdır.
MyRemotableObject.cs
using System; namespace ConfigSerAppProg.RemObjects { public class MyRemoteObject : MarshalByRefObject { int executionCount = 0; // Constructer public MyRemoteObject() { executionCount = 0; Console.WriteLine("MyRemoteObject has been constructed..."); } // Destructer ~MyRemoteObject() { Console.WriteLine("MyRemoteObject has been destructed..."); } public int GetExecutionCount() { executionCount++; return executionCount; } } }
NOT
Oluşturacağımız tüm kodlar farklı Visual Studio projeleri içerisinde oluşturulmalıdır. Örneğin Oluşturduğumuz MyRemotableObject class’ı ConfigSerAppProg.RemObjects projesi içerisinde ConfigSerAppProg.RemObjects namespace’i ile tanımlanmıştır. Dolayısı ile birazdan ConfigSerAppProgrammatic ismiyle oluşturacağımız Remoting server’ı projemizde bu proje tarafından oluşturulacak olan assembly’leri Add Reference menüsü aracılığı ile eklememiz gerekmektedir.
Şimdi MyRemotableObject olarak isimlendirdiğimiz object’i sunacak olan Remoting server’ımızı yazalım.
RemotingServer.cs
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using ConfigSerAppProg.RemObjects; namespace ConfigSerAppProgrammatic { public class RemotingServer { static void Main(string[] args) { IDictionary channelProperties = new Hashtable(); channelProperties.Add("name", "MyTcpChannelName"); channelProperties.Add("port", "1234"); channelProperties.Add("priority", "1"); TcpChannel tcpChannel = new TcpChannel(channelProperties, new SoapClientFormatterSinkProvider(), new SoapServerFormatterSinkProvider()); ChannelServices.RegisterChannel(tcpChannel, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyRemoteObject), "MyRemoteObject.rem", WellKnownObjectMode.Singleton); string[] urls = tcpChannel.GetUrlsForUri("MyRemoteObject.rem"); string objectUrl = urls[0]; string objectUri = null; string channelUri = tcpChannel.Parse(objectUrl, out objectUri); Console.WriteLine("The URL for the object is {0}.", objectUrl); Console.WriteLine("The URI for the object is {0}.", objectUri); Console.WriteLine("The URI for the channel is {0}.", channelUri); Console.WriteLine("Remoting server is now listening..."); Console.WriteLine("Press Enter to exit."); Console.ReadLine(); } } }
Yazmış olduğumuz kodları sırasıyla şu şekilde açıklayalım.
- TcpChannel class’ının parametre olarak alacağı IDictionary tipindeki collection object’imizi oluşturduk ve bu collection’a channel’ın ismi olan “name” değerini, channel’ın üzerinde çalışacağı port olan “port” değerini ve birden fazla channel register edilmesi durumunda channel’ların öncelik sırasını belirleyen “priority” değerlerini tanımladık.
- TcpChannel tipindeki tcpChannel değişkenimizi create ettik ve seçmiş olduğumuz channel tipinin TCP olmasına rağmen biz formatter olarak Soap kullanacağımızı belirttik.
- tcpChannel değişkeni üzerinde tuttuğumuz channel’ımızı register ettik.
- Yapmış olduğumuz Remoting Configuration’ınını uygulamamız üzerinde register ettik. Bu işlem sırasında remotable type’ımızın Singleton modunda çalışacağını belirttik.
- Servisimiz ile ilgili URL ve URI bilgilerini sadece bilgi edinmek amacıyla ekrana yazdırdık.
Visual Studio üzerinde uygulamayı çalıştırdığımızda karşımıza aşağıdaki ekran gelir:
UYARI
Ekran görüntüsü içerisinde görünen IP adresi bilgisayarınızın network konfigürasyonuna göre farklılık gösterebilir.
RemotingServer class’ı içerisinde kullandığımız bazı method’lar ve görevleri aşağıdaki gibidir.
Method
|
Görev |
ChannelServices.RegisterChannel | Uygulama içerisinde belirlediğimiz channel’ın register edilmesini sağlar. Bu channel geliştirilen uygulamaya göre client ve ya server görevi görecek bir channel olabilir. |
RemotingConfiguration.RegisterWellKnownServiceType | Uygulamayı geliştirmeden önce geliştirilen remotable type’ın (ör: MyRemotableType) Remoting server’ı üzerinde register edilmesini sağlar. Remotably object’lerin URI’ları method’un 2. parametresinde verilen isme göre belirlenecektir. |
tcpChannel.GetUrlsForUri | Verilen isme göre sistemin network ayarlarını algılayıp URI bilgilerini vermek için kullanılabilir. Normal olarak Remoting server’ının çalışması ile görevli değildir. Yalnızca bilgi amaçlı gösterilmiştir. |
tcpChannel.Parse | Verilen URL’i üzerinden channel URI’ını oluşturarak geri döndürür. Ayrıca ikinci parametresi ile “out” olarak object’in URI’ını döndürür. |