Home Contact RSS

Archive for April, 2008

Makale 12: Sunucu Uygulamasındaki Bir Methodun Senkronize Olarak Çağırılması

Remote object’in instance’ının Remoting server’ı üzerinde oluşturulup Remoting client’a gönderilmesinin ardından Remoting client’ı üzerinde referansı tutulan object Remoting client üzerinde aynen local bir object gibi kullanılabilir. Remoting server’da bulunan ve Remoting client’ında sadece referansı tutulan bu object’lerin herhangi bir method’u call edildiğinde bu işlem tamamiyle Remoting server’ı üzerinde çalışacaktır.

Öncelikle daha önceki makalelerde yazmış olduğumuz Remoting server’ın host ettiği MyRemotableType class’ının özelliklerini hatırlayalı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 field’ının çalıştırılma zamanındaki değerini geri göndürecek olan method’dur.

Tablo 3.1.2

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 MyFirstRemotingClient 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 MyFirstRemotingClient şeklinde değişir, eğer değişmemiş ise bu property’ye de MyFirstRemotingClient 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 “Program.cs” isimli bir dosya açık olacak çıkar.

9.     Bu dosyanın ismini Solution Explorer penceresi yardımı ile “MyRemotingClient.cs” olarak değiştirin.

10.  Visual Studio “Program.cs” dosyasının ismini değiştirdikten sonra bu dosya içerisindeki “Program” isimli class’ın ismi otomatik olarak “MyRemotingClient” şeklinde değişir. Değişmemesi durumunda class’ın ismini “MyRemotingClient” olarak değiştirin.

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

12.  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.

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

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

15.  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.

16.  MyRemotingClient.cs dosyası içerisinde aşağıdaki namespace’leri import edin:

MyRemotingClient.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;
using MyFirstRemotableType;

17.  MyRemotingClient class’ının access modifier’ını public olarak ayarlayın.

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

public class MyRemotingClient

18.  Remote object’in instance’ını IMyRemotableType type’ındaki object’e atayın ve bu object’in üzerindeki GetServerDateTime method’unu call ederek dönen değeri command prompt’a yazdırın.

Remote Object’in instance’ına erişimlesi

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

Console.WriteLine(remoteObject.GetServerDateTime());

19.  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("Press ENTER to exit.");
Console.ReadLine();

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

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

22.  Visual Studio’yu kapatın.

Remoting Client’ını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 MyFirstRemotingClient 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 “MyFirstRemotingClient.exe” yazarak ENTER tuşuna basın.

4.     Bilgisayarınızda herhangi bir firewall uygulaması yüklü olması durumunda karşınıza “MyFirstRemotingClient” uygulamasının internet ve ya network üzerinden bağlantı sağlamasının 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’ın üzerinde çalıştığı bilgisayarın tarih ve saat bilgileri ile birlikte “Press ENTER to exit.” yazısı belirir.

Özet

  • Remote object’ler Remoting server üzerinde create edildikten sonra instance’ları Remoting client’larına gönderilen ve client üzerinde bu object üzerinde bir işlem yapılması durumunda işlem object’in Marshal-by-ref olması durumunda Remoting server’ı üzerinde execute edilecektir.
  • Remoting client’ları hem configuration file kullanılarak hem de programmatic olarak configure edilebilmektedir. Fakat remote object’ler Activator class’ının GetObject method’u kullanılarak erişilebilirler.

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();

Microsoft Sharepoint Conference 2008

istanbulbannerbottomkizEN

The Microsoft Sharepoint Conference 2008 Istanbul is the third and final of three global SharePoint conferences, following Seattle and Dubai.

This world-class, two-day conference, to be held at the Swissotel, Istanbul from April 10-11, will showcase the lates innovations, features and functionality for the 2007 SharePoint prodcuts and technologies.

The Microsoft SharePoint Conference 2008 Istanbul will provide an unprecedented opportunity for customers and partners in the region to meet and network with Office System product teams, fellow IT professionals, and partners.

The sessions will be delivered by Product Managers coming from the Product Group, MVPs, Partners and specialists from the Istanbul Office.

Speakers

The sessions will be delivered by Product Managers coming from the Product Group, MVPs, Partners and specialists from the Istanbul Office.

Joel Oleson : SharePoint Senior Technical Product Manager
Jerome Thiebaud : SharePoint Designer Product Manager
Joseph Khalaf : SharePoint Global Support Engineer
Todd Klindt : Windows Sharepoint Services MVP, TechNet Magazine Writer
Patrick Beeharry : Office Servers Product Manager, Microsoft MEA

Who are the Target Audience for SharePoint Conference 2008- Istanbul?

The session content is targeted at IT Professionals and Architects. Seasoned SharePoint professionals as well as people that are new to SharePoint Products and Technologies will all learn something new! The content theme this year is “Real world guidance and experience”, we have top notch speakers lined up from Microsoft, our customers, our Partners and the MVP technical community all geared up to share their knowledge.

To register for the event:
http://www.sharepointconferenceistanbul.com/en/register/Pages/default.aspx