Archive for April, 2008
April 25, 2008 at 18:50 · Tags: .net framework
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.
April 19, 2008 at 12:34 · Tags: .net framework, remoting
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 “
April 13, 2008 at 02:14 · Tags: .net framework, remoting
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. |
April 8, 2008 at 03:42 · Tags: .net framework, remoting
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();
April 3, 2008 at 13:11 ·
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