Home Contact RSS

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.

Leave a Comment