Makale 11: İstemci Uygulamalarının Konfigürasyon Dosyası İle Yapılandırılması

Remoting client’ları da aynen Remoting server’larında olduğu gibi, gerekli configuration dosyalarını okumaları sağlanarak da configure edilebilirler (ör: machine.config).

Yeni bir Visual Studio projesi oluşturup, proje tipi olarak “Console Application” seçeneğini seçelim ve proje ismini de “ConfigCliAppConfigFile” olarak verelim. Solution içerisine “Class Library” tipinde yeni bir proje daha ekleyelim. Bu class library projesinin ismini “ConfigCliAppCFile.RemObjects” olarak verelim. Oluşturduğumuz class library projesine “Configure a Server Application Programmaticaly” başlığı altında yaptığımız örnekte kullandığımız “MyRemotableObject” class’ını birebir olarak ekleyelim.

“ConfigCliAppCFile.RemObjects” projesini “ConfigCliAppConfigFile” projesine referans olarak ekledikten sonra console application projemize yeni bir configuration dosyası ekleyerek ismini “ConfigCliAppConfigFile.exe.config” olarak değiştirelim. Bu dosya içeriğini de aşağıdaki şekilde değiştirelim.

ConfigCliAppConfigFile.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
                <channel ref="tcp" port="0">
                    <serverProviders>
                        <formatter ref="soap"/>
                    </serverProviders>
                </channel>
            </channels>
            <client>
                <wellknown
                    type="ConfigCliAppCFile.RemObjects.MyRemotableObject, ConfigSerAppCFile.RemObjects"
                    url="http://localhost:1234/MyRemotableType.rem"
                />
            </client>
        </application>
    </system.runtime.remoting>
</configuration>

Yukarıdaki kodlarda görmüş olduğunuz gibi Remoting client uygulamasını aynen Remoting server’ı configuration file’dan yapmış olduğumuz gibi configure edebiliyoruz.

Bu noktada dikkat edilmesi gereken en önemli nokta <application> node’u altındaki <service> node’unun artık <client> olarak kullanılıyor olması. Bu değişikliği yapmak zorunda olmamızın sebebi bir Remoting server yerine Remoting client configure ediyor olmamız. Ayrıca, <wellknown> node’unun attribute’lerinden olan objectUri attribute’unun de url olarak değiştirilmelidir çünkü Remoting server’ın host ettiği object’in hangi URL’de olduğunu Remoting client ancak bu şekilde bilebilir.

Son olarak da uygulamamızı tanımlamış olduğumuz configuration dosyasını okuyacak ve Remoting configuration’ını kendi kendine yapacak şekile getirelim.

RemotingClient.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace ConfigCliAppConfigFile
{
    public class RemotingClient
    {
        static void Main(string[] args)
        {
            RemotingConfiguration.Configure("../../ConfigCliAppConfigFile.exe.config", false);

            TcpChannel tcpChannel = ChannelServices.RegisteredChannels[0] as TcpChannel;

            if (tcpChannel == null)
            {
                Console.WriteLine("Invalid configuration file...");
                Console.WriteLine("Press Enter to exit.");
                Console.ReadLine();
            }

            WellKnownClientTypeEntry[] registeredWellKnownClientTypes = RemotingConfiguration.GetRegisteredWellKnownClientTypes();

            foreach (WellKnownClientTypeEntry type in registeredWellKnownClientTypes)
            {
                Console.WriteLine("{0} is registered.", type.TypeName);
            }

            Console.WriteLine("I am now connected to the Remoting server...");
            Console.WriteLine("Press Enter to exit.");
            Console.ReadLine();
        }
    }
}

Yazmış olduğumuz kodları sırasıyla şu şekilde açıklayalım.

  • RemotingConfiguration class’ının sahip olduğu static olarak işaretlenmiş Configure method’unu kullanarak configuration bilgilerimizi barındıran configuration dosyasını okumasını ve Remoting configuration’ını bu dosyadaki bilgiler doğrultusunda yapmasını sağladık.
  • Remoting configuration’ı içerisinde “WellKnownClient” olarak register edilmiş olan remotable type’ları registeredWellKnownClientTypes değişkenine atadık.
  • registeredWellKnownClientTypes değişkenini foreach döngüsü içerisine alarak register edilmiş object’lerin TypeName bilgilerini ekrana, sadece bilgi amaçlı olarak, yazdırdık..

Visual Studio üzerinde uygulamayı çalıştırdığımızda karşımıza aşağıdaki ekran gelir:

RemotingClient class’ı içerisinde kullandığımız bazı method’lar ve görevleri aşağıdaki gibidir.

Method


Görev
RemotingConfiguration.GetRegisteredWellKnownClientTypes Configuration dosyasında bulunan <client> nodu’u içerisinde register edilen remotable type’ların listesinin alınabileceği method’dur.

UYARI

Remoting uygulamanızın üzerinde çalışacağı port bilgisini yazarken ilgili port’un başka bir uygulama tarafından kullanılmadığından emin olunuz. Örneğin IIS’in 80. port üzerinde çalıştığını düşünürseniz ve siz de uygulamanızı 80. port üzerinden çalışacak şekilde ayarlarsanız aşağıdaki hata ile karşılaşırsınız:

System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted

You may also like...

Leave a Reply

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