NET Remoting. چیست؟

.NET Remoting  سیستمی کلی  برای برقراری ارتباط بین Applicationهاست. امتیاز ویژه ی آن در برابر دیگر سیستمهای ارتباطی این است که می تواند در اتصالات ناهمگن یک شبکه و حتی بین کامپیوترهای مختلف با زبانهای متفاوت به کار رود. .NET Remoting  یکی از  APIهای مایکروسافت است که در سال 2002 با .NET Framework  1.0 منتشر شد . آنچه که انجام می شود عمدتا بر اساس ایجاد شیئی است که اصطلاحا آن را Remotable Object می نامند.


سیستم  .NET Remoting  شما را قادر می سازد تا بین اشیاء متفاوت در برنامه هایی با دامنه های متفاوت یا پردازشهای متفاوت با استفاده از پروتکل های انتقالی مختلف مانند HTTP ، TCP/IP ، SOAP و ... ارتباط برقرار نمایید.


در سمت client و server چه بر سر  Remotable object  می آید؟


در ابتدا نیاز داریم که client تنها شیوه ی نمایش نتیجه را بشناسد. هنگامی که درخواستی به وجود می آید ، Remotable Objectبه Client ارجاع داده می شود. در سمت client یک نمونه ی ساختگی شامل متدها و پارامترها، از این شیئ ایجاد می شود که به عنوان شیئ محلی مورد استفاده قرار می گیرد.سپس یک  Proxy برای ارتباط سرور و  Clientایجاد می شود.متدهایی از شیئ و مقدار هایی که باید به آنها داده شود همگی به ترتیب به صورت رشته ای از بایتها توسط این Proxy به سرور  انتقال می یابد .Proxy  آنها را برای سرور می خواند ، متدها فراخوانی شده و نتیجه دوباره در Proxy  قرار می گیرد تا سمت client به نمایش در آید.
Remotable objectها از طریق کانالهای ارتباطی قابل دسترسی هستند که به صورت فیزیکی پیامها را به آنها انتقال می دهند.در اینجا دو نوع کانال موجود است  TCP channel & Http channel  نام آنها روشی را که باید مورد استفاده قرار گیرند به پروتکل می دهد.


ساختن  Remotable Object


Remotable object چیزی بیش از یک شیئ که از MarshalByRefObject ارث می برد نیست.نمونه ای که در زیر آمده متدی است برای نمایش کلمه ی  “Hello World” که یک رشته بر می گرداند.آنچه که در متدها برگردانده می شود تنها باید کلاسی از .NET Framwork  باشد مانند  String  یا  DataSet. به علاوه در صورتی که لازم است شیئی که تعریفی دیگر دارد را بسازید باید Serializable   باشد .

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

namespace CodeGuru.Remoting
{
  ///
  /// Sample object to demonstrate the use of .NET Remoting.
  ///

  public class SampleObject : MarshalByRefObject
  {
   ///
   /// Constructor
   ///

   public SampleObject()
   {
   }

   ///
   /// Return a hello message
   ///

   /// Hello world message
   public string HelloWorld()
   {
     return "Hello World!";
   }
  }
}                                                 

ساختن یک سرور برای نمایش   Remotable Object


ما احتیاج به سروری داریم که مانند یک شنونده (Listener) عمل کند و منتظر درخواستی از  remotable object  باشد. به طور مثال از کانال  TCP/IP استفاده می کنیم. ابتدا یک نمونه از کانال را می سازیم سپس آن را برای استفاده از Client روی Port خاصی ثبت می کنیم.این سرویس می تواند هم مانند WellKnownObjectMode.SingleCall ثبت شود که برای هر Client نمونه ی جدیدی از شیئ را نتیجه می دهد، و هم می تواند به صورت WellKnownObjectMode.Singleton باشد که از یک نمونه شیئ را برای تمام Clientها نتیجه می دهد.سپس ارجاعی از SampleObject را که قبلا ساختیم در کلاس جدید قرار می دهیم.در غیر این صورت برنامه کامپایل نمی شود زیرا نمی داند  چگونه به آن دسترسی پیدا کند.
اگر می خواهید از IIS استفاده کنید نیازی به ساختن سروری شنونده ندارید، چرا که  IIS تنها استفاده از  HttpChannelرا پشتیبانی می کند.یک دایرکتوری مجازی (virtual directory) بسازید و کد را برای ثبت در رویداد شروع (Application_Start event)  قرار دهید.



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

namespace CodeGuru.Remoting
{
  ///
  /// Sample server to demonstrate the use of .NET Remoting.
  ///

  public class SampleServer
  {
   public static int Main(string [] args)
   {
    // Create an instance of a channel
     TcpChannel channel = new TcpChannel(8080);
     ChannelServices.RegisterChannel(channel);
  
     // Register as an available service with the name HelloWorld
     RemotingConfiguration.RegisterWellKnownServiceType(
         typeof(SampleObject),
         "HelloWorld",
         WellKnownObjectMode.SingleCall );

     System.Console.WriteLine("Press the enter key to exit...");
     System.Console.ReadLine();
     return 0;
   }

  }
}

ساختن Client برای استفاده از  Remotable Object

حالا باید یک  Client برای استفاده از آنچه که ساخته ایم، ایجاد کنیم.ساختن  Client ساده است، ما می خواهیم به سرور وصل شود یک نمونه از سرور ایجاد کند سپس متد HelloWorld را اجرا کند.

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

namespace CodeGuru.Remoting
{
  ///
  /// Sample client to demonstrate the use of .NET Remoting.
  ///

  public class SampleClient
  {
   public static int Main(string [] args)
   {
     // Create a channel for communicating w/ the remote object
     // Notice no port is specified on the client
     TcpChannel chan = new TcpChannel();
     ChannelServices.RegisterChannel(chan);

     // Create an instance of the remote object
     SampleObject obj = (SampleObject) Activator.GetObject(
         typeof(CodeGuru.Remoting.SampleObject),
         "tcp://localhost:8080/HelloWorld" );

     // Use the object
     if( obj.Equals(null) )
     {
       System.Console.WriteLine("Error: unable to locate server");
     }
     else
     {
       Console.WriteLine(obj.HelloWorld());
     }
     return 0;
   }
  }
}
                          **************************************
منابع:

http://www.developer.com/net/cplus/article.php/10919_1479761_1
http://en.wikipedia.org/wiki/.NET_Remoting