Home Contact RSS

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

Makale 10: İstemci Uygulamalarının Çalışma Zamanında Yapılandırılması

Remoting client’larının programmatic configuration’ları Remoting server’lar ile büyük bir oranda benzerlik gösterirler. Ancak kullanılan bazı methodlar deÄŸiÅŸecektir. ÖrneÄŸin Remoting server’ın programmatic configuration’ı sırasında kullanılan ve Remotable Type’ın register edilmesini saÄŸlayan RemotingConfiguration.RegisterWellKnownServiceType method’u Remoting client’larında RemotingConfiguration.RegisterWellKnownClientType ÅŸeklinde kullanılmaktadır.

Client-Server farkı bağlamında değişen bu methodlar haricinde channel, formatter gibi configuration bilgileri her iki taraf için de aynı şekilde tanımlanmaktadır.

Remoting server’larının programmatic olarak nasıl configure edilebileceÄŸini görelim.

RemotingClient.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Collections;
using ConfigCliAppProg.RemObjects;
namespace ConfigCliAppProgrammatic
{
    class RemotingClient
    {
        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.RegisterWellKnownClientType(typeof(MyRemoteObject), "http://localhost:1234/MyRemoteObject.rem");

            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.

  • Daha önce öğrenmiÅŸ olduÄŸunuz ÅŸekilde TCP protokolünü kullanan channel’ı register ettik.
  • MyRemoteObject type’ındaki object’lerle ilgili iÅŸlemler için bu object’in instance’ının hangi URL’de olduÄŸunu register ettik.

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.RegisterWellKnownClientType Uygulamayı geliÅŸtirmeden önce geliÅŸtirilen remotable type’ın (ör: MyRemotableType) Remoting client’ı üzerinde Server Activated Object register edilmesini saÄŸlar.

Makale 9: Bir istemci uygulamasının oluşturulması ve yapılandırılması

GiriÅŸ

Daha önceki makalelerde Remoting server’larını nasıl configure ettiÄŸimizi, Remotably Type’ları nasıl host ettiÄŸimizi ve bir Remoting server’ını build edip sonrasında da bu uygulamanın nasıl çalıştırıldığını öğrendiniz. Bu chapter’da ise çalışmakta olan Remoting server’a baÄŸlanacak ve Remoting server üzerinde host edilen Remotable Type’ların instance’larını create ederek remote object’leri kullanacak olan Remoting client’ları üzerine bilgiler edineceÄŸiz.

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

  • Remote object’lerin nasıl create edileceÄŸini ve kullanılacağını bileceÄŸiz.
  • Remoting client’ı olarak çalışan bir uygulamayı programmatic olarak configure edebileceÄŸiz.
  • Remoting client’ı olarak çalışan bir uygulamayı configuration file’ı kullanarak configure edebileceÄŸiz.
  • Remoting client’ı olarak çalışan bir uygulamayı nasıl build edip çalıştıracağımızı bileceÄŸiz.

Bir Remote Object OluÅŸturmak

Remote object’ler Remoting server’ı üzerinde Remotable Type olarak tanımlanmış olan ve Remoting client tarafında instance’ı create edilerek kullanılabilecek olan object’lerdir ve Remoting server’ının configuration’ında belirtilen URL’den eriÅŸilebilirler.

Remote object’ler Remoting server’ı üzerinde register edilmeden önce karar verilmesi gereken nokta remote object’in server üzerinde mi yoksa client üzerinde mi çalışması gerektiÄŸidir. Remoting server üzerinde çalışan remote object’lere Server Activated Object ismi verilmektedir. Yine Remoting server’ında çalışan fakat yalnızca client’ın request etmesi durumunda create edilen remote object’ler ise Client Activated Object olarak isimlendirilir.

Server Activated Object

Server Activated Object’ler tamamı ile Remoting server üzerinde bulunan, tüm iÅŸlemlerini server üzerinde yapan ve Remoting client’ında ise sadece referansı tutulan remote object’lerdir. Remoting configuration file’ı içerisinde <wellknown> node’u içerisinde tanımlanan remotable type’lar Server Activated Object seçeneÄŸi ile tanımlanmış type’lardır. Programmatic olarak configure edilen Remoting uygulamalarında ise aÅŸağıdaki method’lar kullanılarak register edilirler.

Client / Server


Method
Client RemotingConfiguration.RegisterWellKnownClientType
Server RemotingConfiguration.RegisterWellKnownServiceType

Remoting server üzerinde bulunan Server Activated Object instance’ına eriÅŸmek için System namespace’i içerisindeki Activator class’ının static olaran tanımlanmış olan GetObject method’u kullanılır.

ÖrneÄŸin, Chapter 1′de yazmış olduÄŸumuz Remoting server’ında host edilen MyRemotableType tipindeki object’e eriÅŸmek için aÅŸağıdaki kod kullanılır.

Remoting server’da host edilen object instance’ına eriÅŸilmesi

IMyRemotableType myObject = (IMyRemotableType)Activator.GetObject
    (typeof(IMyRemotableType), "tcp://localhost:4444/MyRemotableType.rem");

Server Activated Object’lerin programlanması sırasında dikkat edilmesi gereken en önemli configuration Remoting server’ı üzerinde yapılan ve object’in register edildiÄŸi configuration’dır. Bu configuration sırasında, daha önceki örneklerimiz sırasında Singleton olarak kullanmıştık, iki opsiyon bulunmaktadır. Bunlar Singleton ve SingleCall opsiyonlarıdır.

Singleton Instance

Singleton olarak configure edilen object’ler sunucu üzerinde ilk initialize edilmeleri sonrasınta life-time’ları boyunca saklanırlar ve bu object’i herhangi bir Remoting client’ının request etmesi durumunda sunucu hazır halde bulunan object’i geri döndürür ve ya hazır durumda bir object bulunmuyorsa yeni bir instance create edip geri döndürerek bu object’i daha sonraki Remoting client request’leri için saklar. Dolayısı ile Singleton olarak instance’ı oluÅŸturulan object’ler sunucu üzerinde sadece bir instance’a sahiptirler.

SingleCall Instance

SingleCall olarak configure edilen object’ler Remoting client’ın her request’i sonrasında yeniden oluÅŸturulurlar ve Remoting client’a geri döndürülürler. Yani iki farkli Remoting client’ın aynı object’i kullanması mümkün deÄŸildir.

Client Activated Object

Client Activated Object’ler de aynen Server Activated Object’ler gibi Remoting server’ı üzerinde host edilen ve client tarafında sadece referansı bulunan remote object’lerdir. Tek farklılık ise Client Activated Object’lerin yalnızca client istediÄŸi taktirde oluÅŸtuturulmasıdır.

Remoting configuration file’ı içerisinde <activated> node’u içerisinde tanımlanan remotable type’lar Client Activated Object seçeneÄŸi ile tanımlanmış type’lardır. Programmatic olarak configure edilen Remoting uygulamalarında ise aÅŸağıdaki method’lar kullanılarak register edilirler.

Client / Server


Method
Client RemotingConfiguration.RegisterActivatedClientType
Server RemotingConfiguration.RegisterActivatedServiceType

Remoting server üzerinde bulunan Client Activated Object instance’ına eriÅŸmek için System namespace’i içerisindeki Activator class’ının static olaran tanımlanmış olan CreateInstance method’u kullanılabildiÄŸi gibi, programmatic configuration tamamlandıktan ve Client Activated Object’ler register edildikten sonra object’in type’ındaki herhangi bir class’ın new keyword’ü ile yeni bir instance’ının oluÅŸturulması durumunda da client activation devreye girecek ve remote object Remoting server üzerinde oluÅŸturularak client’a referansı gönderilecektir.

ÖrneÄŸin, tcp://localhost:1234/MyRemotableType.rem adresinde bulunan Client Activated Object’in yeni bir instance’ına eriÅŸme iÅŸlemi ÅŸu seçeneklerle yapılabilir.

UYARI

AÅŸağıdaki kod örneklerinden önce remoting configuration’ının programmatic olarak ve ya configuration file kullanılarak configure edilmesi ve MyRemotableType type’ındaki remotable type’ın tcp://localhost:1234/MyRemotableType.rem URL’inde bulunduÄŸunun belirtilmesi gerekir.

Remoting server’da host edilen client activated object instance’ına eriÅŸilmesi – Yöntem 1

MyRemotableType myObject = (MyRemotableType)Activator.CreateInstance
    (typeof(MyRemotableType));

Remoting server’da host edilen client activated object instance’ına eriÅŸilmesi – Yöntem 2

MyRemotableType myObject = new MyRemotableType();

Makale 8: Bir Sunucu Uygulamasının Derlenmesi – Bölüm 3

Remoting Server’ın Çalıştırılması

1.     Start menüsü içerisinde bulunan “Run” kısayoluna tıklayın ve karşınıza çıkan ekrana “cmd” yazarak OK butonuna tıklayın.

2.     Açılan ekranda command prompt’a cd command’ını kullanarak MyFirstRemotingServer project’inizin bulunduÄŸu klasöre, oradan da sırasıyla “bin” ve “Debug” klasörlerine girin.

3.     İlgili klasörlere girdikten sonra command prompt’a “MyFirstRemotingServer.exe” yazarak ENTER tuÅŸuna basın.

4.     Bilgisayarınızda herhangi bir firewall uygulaması yüklü olması durumunda karşınıza “MyFirstRemotingServer” uygulamasının internet ve ya network üzerinden baÄŸlantı kabul etmesinin block’landığına dair bir mesaj gelebilir.

5. Bu durumda uygulamanın unblock edilmesi gerekir.

6. Uygulamanın düzgün çalışması durumunda command prompt’ta “Remoting server is running… Press ENTER to exit.” yazısı belirir.

Bu yazıyı gördüğünüzde, yazmış olduÄŸunuz ilk Remoting server’ı baÅŸarıyla çalışıyor demektir.

NOT

MyRemotableType object’inin ilk olarak MyFirstRemotableType project’i içerisinde interface olarak yazılmış olmasının amacı Remoting client’ın bu interface’i kullanacak olmasıdır. Class ise MyFirstRemotableServer project’i içerisinde geliÅŸtirilmiÅŸtir. Böylece Remoting client sürekli olarak interface’i kullanacaktır ve class içerisindeki programmatic deÄŸiÅŸiklikler sebebiyle, her seferinde Remoting client’larının tamamının yeniden deploy edilmesine gerek kalmayacaktır. Herhangi bir güncelleme durumunda yalnızca Remoting server’ın yeniden deploy edilmesi güncelleÅŸtirmeyi saÄŸlayacaktır.

Özet

  • Remotable Type’lar Marshal-by-value ve Marshal-by-reference olarak iki ÅŸekilde oluÅŸturulabilirler.
  • Channel, Remoting server’ı ve Remoting client’ının aralarındaki haberleÅŸme için kullanılan protokole verilen genel isimdir.
  • .NET Framework içerisinde HTTP, TCP ve IPC olarak üç adet channel bulunmaktadır. Gerekli görüldüğü durumlarda System.Runtime.Remoting.Channels.IChannelReceiver ve System.Runtime.Remoting.Channels.IChannelSender interface’leri implement edilerek custom channel’lar hazırlanabilir.
  • HTTP channel’ı maksimum interoperability’ye sahiptir. TCP channel’ı maksimum efficiency’ye sahiptir. IPC channel’ı network üzerinden iletiÅŸim saÄŸlamadığı için yalnızca aynı fiziksel bilgisayar üzerinde bulunan application domain’leri üzerindeki Remoting server ve client’ları arasındaki iletiÅŸim için kullanılabilir.
  • Formatter, channel üzerinden geçecek olan mesajları ilgili formatter’ın yapısına göre ÅŸekillendiren yapıdır.
  • .NET Framework içerisinde SoapFormatter ve BinaryFormatter tipinde iki adet formatter bulunmaktadır. Gerekli görüldüğü durumlarda System.Runtime.Remoting.Messaging.IRemotingFormatter interface’ini implement ederek custom formatter’lar hazırlanabilir.
  • Remoting server’ları ve Remoting client’ları hem configuration file kullanılarak hem de programmatic olarak configure edilebilmektedir.

Makale 7: Bir Sunucu Uygulamasının Derlenmesi – Bölüm 2

Bu işlemler sonrasında New Project ekranı aşağıdaki şekilde görünür:

NOT

Location property’sinde yazmakta olan “C:\Path\to\Your\Project” path’i seçmiÅŸ olduÄŸunuz path’e göre deÄŸiÅŸiklik gösterektir.

1. OK butonuna tıklayın.

2. Karşınıza “Program.cs” isimli bir dosya açık olacak çıkar.

3. Bu dosyanın ismini Solution Explorer penceresi yardımı ile “MyRemotingServer.cs” olarak deÄŸiÅŸtirin.

4. Visual Studio “Program.cs” dosyasının ismini deÄŸiÅŸtirdikten sonra bu dosya içerisindeki “Program” isimli class’ın ismi otomatik olarak “MyRemotingServer” ÅŸeklinde deÄŸiÅŸir. DeÄŸiÅŸmemesi durumunda class’ın ismini “MyRemotingServer” olarak deÄŸiÅŸtirin.

5. Solution Explorer penceresindeki References klasörüne saÄŸ tıklayarak “Add Reference” seçeneÄŸine tıklayın.

6. Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “.NET” tab’ındaki “System.Runtime.Remoting” assembly’sini seçin ve OK butonuna tıklayın.

7. MyRemotingServer.cs dosyası içerisinde aÅŸağıdaki namespace’leri import edin:

MyRemotingServer.cs dosyasına import edilecek namespace’lerin import ediliÅŸleri

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

8. MyRemotingServer class’ının access modifier’ını public olarak ayarlayın.

MyRemotingServer class’ının “public” access modifier’ına sahip olarak ayarlanması

public class MyRemotingServer

9. Remoting server’ımızı “exe” dosyası ile aynı klasörde bulunacak olan “MyFirstRemotingServer.exe.config” dosyasını okuyarak kendisini configure etmesi için RemotingConfiguration class’ının Configure method’unu kullanın.

RemotingConfiguration.Configure method’unun kullanımı

RemotingConfiguration.Configure("MyFirstRemotingServer.exe.config", false);

10.              Remoting server’ınızı ENTER tuÅŸuna basıldığında programı sonlandıracak ÅŸekilde ilgili kodu yazın.

Console Application’un ENTER tuÅŸu ile sonlandırılması

Console.WriteLine("Remoting server is running... Press ENTER to exit.");
Console.ReadLine();

11.              Solution Explorer ekranında bulunan project’inizin ismine saÄŸ tıklayarak Add menüsünden “New Item…” seçeneÄŸini seçin.

12.              Açılan “Add New Item” ekranında “Application Configuration File” template’ini seçin ve Name property’sini “MyFirstRemotingServer.exe.config” olarak deÄŸiÅŸtirin.

13.              Add butonuna tıklayın.

14.              “MyFirstRemotingServer.exe.config” isimli dosya otomatik olarak açılacaktır.

15.              Configuration dosyasının içeriÄŸini aÅŸağıdaki ÅŸekilde deÄŸiÅŸtirin. Bu configuration dosyasına göre Remoting server’ı TCP protokolü kullanarak, 4444. port üzerinden ve gerekli formatlamaları yaparken BinaryFormatter kullanacak ÅŸekilde çalışacak ayrıca oluÅŸturmuÅŸ olduÄŸumuz MyRemotableType class’ını host edecektir.

MyFirstRemotingServer.exe.config dosyası içeriği

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <service>
                <wellknown
                    mode="Singleton"
                    type="MyFirstRemotingServer.MyRemotableType, MyFirstRemotingServer"
                    objectUri="MyRemotableType.rem"
                />
            </service>
            <channels>
                <channel ref="tcp" port="4444">
                    <serverProviders>
                        <formatter ref="binary"/>
                    </serverProviders>
                </channel>
            </channels>
        </application>
    </system.runtime.remoting>
</configuration>

16.              Solution Explorer penceresindeki References klasörüne saÄŸ tıklayarak “Add Reference” seçeneÄŸine tıklayın.

17.              Karşınıza “Add Reference” penceresi çıkar. Bu pencerede “Browse” tab’ını seçerek “MyFirstRemotableType” project’inin bulunduÄŸu klasöre gidin.

18.              Bu klasör içerisinde de sırasıyla “bin” ve “Debug” klasörlerine girerek “MyFirstRemotableType.dll” isimli assembly’yi seçin ve OK butonuna tıklayın.

19.              Solution Explorer ekranında bulunan project’inizin ismine saÄŸ tıklayarak Add menüsünden “New Item…” seçeneÄŸini seçin.

20.              Açılan “Add New Item” ekranında “Application Configuration File” template’ini seçin ve Name property’sini “MyRemotableType.cs” olarak deÄŸiÅŸtirin.

21.              Add butonuna tıklayın.

22.              “MyRemotableType.cs” isimli dosya açık olacak gelir.

23.              Class’ı ImyRemotableType interface’ini implement edecek ÅŸekilde yazın.

MyRemotableType.cs dosyası içeriği

using System;
using MyFirstRemotableType;
namespace MyFirstRemotingServer
{
    public class MyRemotableType : MarshalByRefObject, IMyRemotableType
    {
        int requestCount;

        public MyRemotableType()
        {
            this.requestCount = 0;
        }

        public DateTime GetServerDateTime()
        {
            requestCount++;
            return System.DateTime.Now;
        }

        public int RequestCount()
        {
            return requestCount;
        }
    }
}

24.  Build menüsünü kullanarak project’i build edin.

25.  Bu iÅŸlem sonrasında Visual Studio’nun sol alt köşesinde “Build succeeded” yazısı belirir.

26.  “Add Project” ekranında project’in Location özelliÄŸine atadığınız path’e gidin.

27.  Bu path içerisinde bulunan “MyFirstRemotingServer.exe.config” isimli dosyayı yine aynı klasörde bulunan “bin” ve bu klasörün altında bulunan “Debug” klasörünün içerisine, yani “MyFirstRemotingServer.exe” dosyasının bulunduÄŸu klasöre kopyalayın.

Bir sonraki makalede diğer adımlar anlatılacaktır.

Makale 6: Bir Sunucu Uygulamasının Derlenmesi – Bölüm 1

Channel, Formatter,  Remotable Type kavramlarının tamamı hakkında bilgi sahibi olduk. Åžimdi Remoting server’ı üzerinde çalışacak ve aÅŸağıdaki class structure’ına sahip olacak Remotable Type’ı host edecek Remoting server’ını yazalım.

Class: MyRemotableType

Access modifier: public

Access Modifier
Return Type Name Purpose
public DateTime GetServerDateTime DateTime class’ının Now property’sini döndürecektir ve RequestCount method’unun döndüreceÄŸi requestCount field’ının deÄŸerini bir deÄŸer arttıracak method’dur.
public int RequestCount requestCount variable’ının çalıştırılma zamanındaki deÄŸerini geri göndürecek olan method’dur.

Tablo 3.1.2

Remotable Type’ın Development’ı

1. Visual Studio’yu çalıştırın.

2. File > New menüleri altındaki Project seçeneğini seçin.

3. Visual C# > Windows seçeneği altındaki Class Library proje tipini seçin.

4. Name property’sine MyFirstRemotableType yazın.

5. Location property’sine projeyi oluÅŸturmak istediÄŸiniz klasörün path’ini yazın ve ya Browse seçeneÄŸini kullanarak path’i gösterin.

6. Solution Name property’si otomatik olarak MyFirstRemotableType ÅŸeklinde deÄŸiÅŸir, eÄŸer deÄŸiÅŸmemiÅŸ ise bu property’ye de MyFirstRemotableType yazın.

Bu işlemler sonrasında New Project ekranı aşağıdaki şekilde görünür:

NOT

Location property’sinde yazmakta olan “C:\Path\to\Your\Project” path’i seçmiÅŸ olduÄŸunuz path’e göre deÄŸiÅŸiklik gösterektir.

7. OK butonuna tıklayın.

8. Karşınıza “Class1.cs” isimli bir dosya açık olacak çıkar.

9. Bu dosyanın ismini Solution Explorer penceresi yardımı ile “IMyRemotableType.cs” olarak deÄŸiÅŸtirin.

10.              Visual Studio “Class1.cs” dosyasının ismini deÄŸiÅŸtirdikten sonra bu dosya içerisindeki “Class1″ isimli class’ın ismi otomatik olarak “IMyRemotableType” ÅŸeklinde deÄŸiÅŸir. DeÄŸiÅŸmemesi durumunda class’ın ismini “IMyRemotingType” olarak deÄŸiÅŸtirin.

11.              Class’ı interface olarak deÄŸiÅŸtirin.

12.              Interface’in kodunu Tablo 3.1.2′deki method’ları içerecek ÅŸekilde, aÅŸağıdaki ÅŸekilde yazın.

MyRemotableType.cs dosyası içeriği

using System;
namespace MyFirstRemotableType
{
    public interface IMyRemotableType
    {
        DateTime GetServerDateTime();
        int RequestCount();
    }
}

13.              Build menüsünü kullanarak project’i build edin.

14.              Bu iÅŸlem sonrasında Visual Studio’nun sol alt köşesinde “Build succeeded” yazısı belirir.

15.              Visual Studio’yu kapatın.

Remoting Server’ın Development’ı

1. Visual Studio’yu çalıştırın.

2. File > New menüleri altındaki Project seçeneğini seçin.

3. Visual C# > Windows seçeneği altındaki Console Application proje tipini seçin.

4. Name property’sine MyFirstRemotingServer yazın.

5. Location property’sine projeyi oluÅŸturmak istediÄŸiniz klasörün path’ini yazın ve ya Browse seçeneÄŸini kullanarak path’i gösterin.

6. Solution Name property’si otomatik olarak MyFirstRemotingServer ÅŸeklinde deÄŸiÅŸir, eÄŸer deÄŸiÅŸmemiÅŸ ise bu property’ye de MyFirstRemotingServer yazın.

Bir sonraki makalede diğer adımlar anlatılacaktır.

Makale 5: Sunucu Uygulamalarının Konfigürasyon Dosyası İle Yapılandırılması

Remoting uygulamaları programatik olarak configure edilebileceği gibi, gerekli configuration dosyalarını okumaları sağlanarak da configure edilebilirler (ör: machine.config).

Bir önceki makalemizde (Makale 4: Sunucu Uygulamalarının Çalışma Zamanında Yapılandırılması) gördüğümüz üzere Remoting server’larının channel ismi, port, priority gibi özellikleri bulunmakta. Åžimdi uygun bir configuration dosyası hazırlayarak uygulamamızı daha az kod yazarak nasıl configure edebileceÄŸimizi görelim.

İPUCU

Remoting uygulamalarının configuration dosyaları kullanılarak configure edilmesi configuration’larda deÄŸiÅŸiklik yapılması durumunda uygulamanın yeniden derlenmesine olan ihtiyacı ortadan kaldıracağı için daha avantajlıdır.

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

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

ConfigSerAppConfigFile.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.runtime.remoting>
        <application>
            <channels>
                <channel ref="tcp" port="1234">
                    <serverProviders>
                        <formatter ref="soap"/>
                    </serverProviders>
                </channel>
            </channels>
            <service>
                <wellknown
                    mode="Singleton"
                    type="ConfigSerAppCFile.RemObjects.MyRemotableObject, ConfigSerAppCFile.RemObjects"
                    objectUri="MyRemotableType.rem"
                />
            </service>
        </application>
    </system.runtime.remoting>
</configuration>

Yukarıdaki kodlarda görmüş olduğunuz gibi channel bilgileri, remotable type bilgileri ve formatter bilgileri configuration dosyaları içerisinde tanımlanabilmektedir.

Bu kodumuzdaki en önemli nokta channel ve formatter tag’ları içerisinde bulunan ref attribute’üdür. Bu attribute machine.config dosyasında tanımlanmış olan bilgilere referans vermek için kullanılır. ref attribute’ünün yerine type attribute’ünün kullanılması durumunda ise ref attribute’ünün kullanılmasına gerek bulunmamaktadır. ÖrneÄŸin MyCustomChannel isminde bir class oluÅŸturduÄŸunumuzu, bu class’ı daha önce bahsettiÄŸimiz IChannelReceiver interface’inden implement ettiÄŸimizi ve class’ın içerisinde bulunduÄŸu assembly’nin isminin de CustomChannelAssembly olduÄŸunu düşünürseniz, type attribute’ü ÅŸu ÅŸekilde tanımlanmalıdır:

“type” attribute’ü kullanımı

<channel type="MyCustomChannel,MyCustomChannelAssembly" port="1234">
    <serverProviders>
        <formatter ref="soap"/>
    </serverProviders>
</channel>

Buradaki type attribute’ü kullanımı birebir olarak uygun ÅŸekilde geliÅŸtirilen formatter’lar için de geçerlidir.

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

RemotingServer.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace ConfigSerAppConfigFile
{
    public class RemotingServer
    {
        static void Main(string[] args)
        {
            RemotingConfiguration.Configure("../../ConfigSerAppConfigFile.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();
            }

            WellKnownServiceTypeEntry[] registeredWellKnownServiceTypes = RemotingConfiguration.GetRegisteredWellKnownServiceTypes();

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

            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.

  • 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 “WellKnownService” olarak register edilmiÅŸ olan remotable type’ları registeredWellKnownServiceTypes deÄŸiÅŸkenine atadık.
  • registeredWellKnownServiceTypes 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..
  • 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
RemotingConfiguration.Configure Configuration dosyasının Remoting uygulamasının configuration’ı için yüklenmesini saÄŸlar. Örnek uygulamada verilen path’in başında herhangi bir bilgi olmadığında uygulama configuration dosyasını kendi bulunduÄŸu path içerisinde arayacaktır. Dosyanın bulunamaması durumunda System.IO.FileNotFoundException throw edilir. Yazmış olduÄŸumuz örnekte configuration dosyasının iki üst klasörde olmasından dolayı bu path’in başına “../../” (2 defa nokta, nokta, slash) ekleyerek dosyanın iki üst klasörde aranmasını saÄŸladık.
RemotingConfiguration.GetRegisteredWellKnownServiceTypes Configuration dosyasında bulunan <service> 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

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.

Makale 3: Remoting Formatter’ları

Remoting Formatter’ları

Channel’lar üzerinden gönderilecek ve alınacak olan bilgilerin tamamı, öncesinde serializa edilmeli ve ondan sonra ilgili channel kullanılarak sistemler arasında geçiÅŸ yapmalıdır. Bu iÅŸlem sırasında hem Remoting server’ı hem de Remoting client’ı aynı sistem üzerinde çalışacak ÅŸekilde configure edilmelidir. Aksi durumda server ya da client’ın gönderdiÄŸi herhangi bir mesaj, diÄŸer taraf için anlamsız bir paket niteliÄŸi taşıyacaktır.

.NET Framework’ün içerisinde kullanılabilecek iki adet formatter bulunmaktadır. Bunlar System.Runtime.Serialization.Formatters.Binary namespace’i içerisinde bulunan BinaryFormatter ve System.Runtime.Serialization.Formatters.Soap namespace’i içerisinde bulunan SoapFormatter class’larıdır. Remoting mimarisi uygulama geliÅŸtiricilerin kendi formatter’larını geliÅŸtirmelerine izin vermektedir. Bunun için yazılım geliÅŸtiren kiÅŸilerin System.Runtime.Remoting.Messaging namespace’i içerisinde bulunan IRemotingFormatter interface’ini implement edilmesi yeterlidir.

NOT

System.Runtime.Remoting.Messaging.IRemotingFormatter interface’i  System.Runtime.Serialization.IFormatter interface’ini kendi içerisinde implement etmektedir. Formatter’ların yapacağı iÅŸin büyük bir kısmı System.Runtime.Serialization.IFormatter interface’i içerisinde tanımlı olan method’ların implementasyonunda belirlenecektir.

Genel olarak avantajlarından ve dezavantajlarından bahsedeceÄŸimiz SoapFormatter ve BinaryFormatter’ların Tcp, Http ya da Ipc channel’ları üzerinde kullanım kısıtlamaları bulunmamaktadır. Yani uygun formatter’a ve uygun channel’a karar verildikten sonra hem SoapFormatter hem de BinaryFormatter istenilen channel’la kullanılabilir. Ayrıca yukarıda anlatılmış olduÄŸu gibi IRemotingFormatter interface’ini implement eden herhangi bir custom formatter da Tcp, Http ya da Ipc channel farkı gözetmeksizin istenilen channel üzerinde kullanılabilir.

SoapFormatter

SOAP kelimesi Simple Object Access Protocol’ün kısaltılmış halidir. Server ve client arasındaki iletiÅŸimin XML altyapısı kullanılarak saÄŸlanması mantığına dayanır. Farklı yapılar ve ya farklı programlama dillerinin XML konusunda verdiÄŸi desteÄŸe dayanarak birbirlerinden farklı ÅŸekillerde çalışan sistemlerin iletiÅŸimi için kullanılabilir.. SOAP kullanımında gönderilen paketler içerisinde hem paketin XML dosyasından nasıl deserialize edileceÄŸi bilgisi hem de paketin içeriÄŸi gönderildiÄŸinden paket boyutları beklenen boyutların üstüne çıkabilir. Bu da SoapFormatter’ın sistemi normalinden daha fazla yorması demektir.

UYARI

SoapFormatter üzerinden sunulacak method’lar yalnızca public olarak tanımlanmış method’lar olabilir.

BinaryFormatter

Binary formatting kullanılması durumunda paketler SOAP formatting’e göre daha ufak boyutlara sahip olacaktır. Bu network trafiÄŸi ve hız açısından büyük bir avantaj olarak görülebilir. BinaryFormatter’ın en büyük dezavantajı yalnızca .NET ile geliÅŸtirilen uygulamalar tarafından kullanılabilir olmasıdır. Fakat performansın önemli olduÄŸu ve hem server’ın hem de client’ın .NET ile geliÅŸtirilmesi durumunda BinaryFormatter SoapFormatter’tan daha performanslı çalışacak ve yalnızca .NET ile geliÅŸtirilen uygulamalar arasında çalışabiliyor olmasının getirdiÄŸi dezavantajlar sistem açısından bir önem teÅŸkil etmeyecektir.

NOT

BinaryFormatter üzerinden sunulacak method’lar hem public hem de private olarak tanımlanmış method’lar olabilir.

Makale 2: Sunucu Uygulaması Kanalları

Remoting Channel’ları

Remoting server’ları ve Remoting client’ları karşılıklı olarak farklı protokoller üzerinde haberleÅŸme ÅŸansına sahiptir ve bu protokoller Remoting kapsamında “channel” olarak isimlendirilmektedir. Channel’lar ile ilgili tüm class ve interface’ler System.Runtime.Remoting.Channels namespace’i içerisinde bulunmaktadır.

.NET Framework içerisinde, hazır olarak kullanılabilir halde üç tipte channel bulunmaktadır. Bu channel’lar ÅŸu ÅŸekildedir;

  • System.Runtime.Remoting.Channels.Http namespace’i içerisinde yer alan HTTP (Hyper Text Transfer Protocol) protokolünü kullanan channel’lar.
  • System.Runtime.Remoting.Channels.Tcp namespace’i içerisinde yer alan TCP (Transmission Control Protocol) protokolünü kullanan channel’lar.
  • System.Runtime.Remoting.Channels.Ipc namespace’i içerisinde yer alan IPC (Interprocess Communication) protokolünü kullanan channel’lar.

Channel’lar üç farklı tipteyken, protokollerin içerisinde bulunan channel sayısının üçten fazla olmasının sebebi Remoting server’larının ve Remoting Client’larının farklı channel’lardan türetiliyor olmalarıdır.

Daha detaya inersek, Remoting server’ları System.Runtime.Remoting.Channels.IChannelReceiver interface’ini implement eden herhangi bir class olmalıyken, Remoting client’ları da System.Runtime.Remoting.Channels.IChannelSender interface’ini implement eden herhangi bir class olmalıdır. Bununla birlikte System.Runtime.Remoting.Channels.IChannelReceiver ve System.Runtime.Remoting.Channels.IChannelSender interface’lerinin her ikisini birden implement ederek hem Remoting client’ı üzerinde hem de Remoting server’ı üzerinde çalışabilecek bir channel oluÅŸturulabilir.

VerdiÄŸimiz detaylardan yola çıkarak System.Runtime.Remoting.Channels.Http, System.Runtime.Remoting.Channels.Tcp ve System.Runtime.Remoting.Channels.Ipc namespace’leri içerisinde bulunan ve channel olarak kullanabileceÄŸimiz class’ları görelim.

Class Açıklama Implements Channel Type


System.Runtime.Remoting.Channels.Http namespace’i içerisinde bulunan channel’lar:

HttpClientChannel Yalnızca Remoting client’ları kullanabilir ve iÅŸlemlerini HTTP protokolünü kullanarak gönderir. IChannelSender HTTP
HttpServerChannel Yalnızca Remoting server’ları kullanabilir ve iÅŸlemlerini HTTP protokolünü kullanarak cevaplar. IChannelReceiver HTTP
HttpChannel Hem Remoting server’ları hem de Remoting client’ları tarafından kullanılabilir ve iÅŸlemlerinin tamamını HTTP protokolünü kullanarak gerçekleÅŸtirir. IChannelSender, IChannelReceiver HTTP

System.Runtime.Remoting.Channels.Tcp namespace’i içerisinde bulunan channel’lar:

TcpClientChannel Yalnızca Remoting client’ları kullanabilir ve iÅŸlemlerini TCP protokolünü kullanarak gönderir. IChannelSender TCP
TcpServerChannel Yalnızca Remoting server’ları kullanabilir ve iÅŸlemlerini TCP protokolünü kullanarak cevaplar. IChannelReceiver TCP
TcpChannel Hem Remoting server’ları hem de Remoting client’ları tarafından kullanılabilir ve iÅŸlemlerinin tamamını TCP protokolünü kullanarak gerçekleÅŸtirir. IChannelSender, IChannelReceiver TCP

System.Runtime.Remoting.Channels.Ipc namespace’i içerisinde bulunan channel’lar:

IpcClientChannel Yalnızca Remoting client’ları kullanabilir ve iÅŸlemlerini IPC protokolünü kullanarak gönderir. IChannelSender IPC
IpcServerChannel Yalnızca Remoting server’ları kullanabilir ve iÅŸlemlerini IPC protokolünü kullanarak cevaplar. IChannelReceiver IPC
IpcChannel Hem Remoting server’ları hem de Remoting client’ları tarafından kullanılabilir ve iÅŸlemlerinin tamamını IPC protokolünü kullanarak gerçekleÅŸtirir. IChannelSender, IChannelReceiver IPC

Tablo 3.1.1: .NET Framework içerisinde bulunan hazır Remoting Channel’ları.

UYARI

System.Runtime.Remoting.Channels.Http, System.Runtime.Remoting.Channels.Tcp ve System.Runtime.Remoting.Channels.Ipc namespace’leri, üzerinde çalıştığınız projenizde System.Runtime.Remoting assembly’sine referans vermediÄŸiniz sürece ulaşılamayacaktır. Bu sebeple projenizin Add Reference bölümünü kullanarak bu assembly’i reference olarak eklemeniz gerekmektedir.

Bu üç protokolün kullanım açısından çeşitli avantajlar ve dezavantajlar sunmaktadırlar. HTTP protokolü kullanılması şu avantajlar ve dezavantajları beraberinde getirmektedir;

  • Remoting server’ı ve client’ları farklı lokasyonlarda, örneÄŸin server ve client’ların birbirine LAN (Local Area Network) ile deÄŸil de Internet gibi herhangi bir WAN (Wild Area Network) ile bir aÄŸ üzerinden baÄŸlı olması durumunda paketlerin firewall ve ya benzeri güvenlik sistemleri tarafından engellenme riski çoÄŸunlukla yoktur.
  • HTTP protokolü üzerinde çalışacak Remoting uygulamalarının IIS gibi sunucular üzerinden çalıştırılması saÄŸlanabilir.
  • Sunucu üzerinde Windows Authentication ve ya SSL (Secure Socket Layer) kullanılması durumunda network güvenliÄŸi baÅŸka bir gereksinime ihtiyaç duyulmadan saÄŸlanabilir.
  • HTTP protokolü aynı anda çok fazla request gelmesi durumunda iÅŸlemlere geç cevap verebileceÄŸi için sistemin yoÄŸun olduÄŸu durumlarda yavaÅŸ çalışabilir.
  • HTTP protokolü üzerinden transfer edilecek olan mesajlar ekstra header bilgilerinin yüklenmesinden dolayı yavaÅŸlıklara sebep olabilir.

TCP protokolünün kullanılması durumunda ise şu avantaj ve dezavantajlara sahiptir;

  • TCP protokolü daha alt seviye paketleri algılayabildiÄŸi için network trafiÄŸini önemli ölçüde az kullanacaktır ve bu da sistem hızını arttıracaktır.
  • Özellikle LAN üzerinde çalışan sistemlerde TCP protokolünün kullanılması tavsiye edilir.
  • Firewall gibi güvenlik araçları kullanılıyorsa TCP protokolü üzerinde kullanılacak port’ların yetkilendirmeye dahil edilmesi gerekir.
  • System.Security namespace’i içerisinde bulunan ilgili class’ları kullanarak özel bir güvenlik sistemi geliÅŸtirilmediÄŸi sürece herhangi bir ön güvenlik sistemine sahip deÄŸildir.

IPC protokolünün kullanılması durumunda ise şu avantaj ve dezavantajlara sahiptir;

  • IPC protokolü herhangi bir network connection’ı kullanmamaktadır. Bu sebeple hem TCP hem de HTTP protokollerine göre çok daha hızlı çalışır.
  • IPC protokolü sadece aynı bilgisayar üzerinde bulunan application domain’leri arasında iletiÅŸim kurulması amacıyla kullanılabilir. Bu da IPC protokolünün farklı bilgisayarlar üzerinde çalışan uygulamalar arasında iletiÅŸim kuramayacağı anlamına gelir.

UYARI

IPC protokolünü yalnızca aynı bilgisayar üzerindeki application domain’lerinin iletiÅŸimi amacıyla kullanılabilir. IPC protokolü bilgisayarınızın içerisinde yer aldığı network connection’larını kullanabilme yeteneÄŸine sahip deÄŸildir.

Next entries »