آمورش Remoting در C#
.net remoting از ارتباطات شی توزیع شده روی انتقال های http و tcp با استفاده از ارائه باینری یا soap جریان داده پشتیبانی می کند.
فریم ورک .net remoting تعدادی سرویس شامل پشتیبانی از activation و lifetime بعلاوه کانل های ارتباطی مسئول انتقال پیام به/از برنامه های ریموت ارائه می کند.
سه مولفه اصلی فریم ورک remoting:
۱- C# remotable object
هر شی خارج از دامین application برنامه caller application باید به عنوان یک شی remote در نظر گرفته بشه. یک شی remote باید از کلاس MarshalByRefObject ارث بری کرده باشه. هر شی ای با این ارث بری می تونه به یک شی remote تبدیل بشه. اشیا بدون ارث بری از MarshalByRefObject اشیا Non-remotable نامیده می شوند.
مثال زیر یک remote object در C# ایجاد می کند (RemoteTime) که زمان جاری را به با استفاده از چارچوب remoting به برنامه کلاینت ارسال می کند. کلاس RemoteTime از MarshalByRefObject ارث بری کرده و درون کلاس یک متد به نام getTime() دارد که زمان جاری را از شی remote بر می گرداند.
using System;
public class RemoteTime : MarshalByRefObject
{
private string currentTime = "";
public string getTime()
{
currentTime = DateTime.Now.ToShortTimeString();
return "Remote Server Time : " + currentTime;
}
}
۲- C# remote listener application
گوش دادن به درخواست ها برای شی remote
بایستی یک شی linstener ایجاد کنیم تا اشیا را در سایر دامین های برنامه قادر کنیم تا نمونه هایی از شی RemoteTime به صورت remote ایجاد کنند. زمانی که یک شی listener ایجاد می کنیم باید یک کانال برای هندل کردن پروتوکل شبکه و فرمت های serilization و ثبت نوع با .net remoting system انتخاب و ثبت کنیم به طوریکه بتواند از کانال برای گوش دادن به درخواست برای آن نوع استفاده کند. C# remote Channels اشیایی هستند که مسئول هندل کردن پروتکل های شبکه و فرمت های serialization هستند.
در کد زیر یک برنامه listener به نام TimeListener ایجاد می کنیم. به عنوان یک شی listener برای نوع راه دور RemoteTime عمل می کند. کلاس Listener باید بتواند فایل TimeListeener.exe.config را پیدا کند تا پیکربندی برای کلاس RemotableType را بارگزاری کند.
using System;
using System.Runtime.Remoting;
public class TimeListener
{
public static void Main()
{
RemotingConfiguration.Configure("TimeListener.exe.config");
Console.WriteLine("Listening for requests from the Client! Press Enter to exit...");
Console.ReadLine();
}
}
ما بایستی یک فایل پیکربندی اضافی ایجاد کنیم تا اطلاعات ارتباطی با شی listener را مشخص کنیم. فایل پیکربندی یک فایل xml است. می توانیم Activation Mode, Remote Type, Channel, Port و .. را مشخص کنیم.
<configuation>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singelton" type="RemoteTime" objectUri="RemoteTime.rem"/>
</service>
<channels>
<channel ref="http" port="9090"/>
</channels>
</application>
</system.runtime.remoting>
</configuation>
۳- C# remote client application
ایجاد درخواست برای شی object
برنامه کلاینت برای فراخوانی متد شی راه دور در C# خیلی ساده و سر راست است. .net remoting system فراخوانی های کلاینت را intercept (رهگیری) خواهد کرد و آنها را به شی remote فوروارد می کمند و نتایج را به کلاینت بر می گرداند. برنامه کلاینت باید برای Remote Type نیز ثبت شود.
اینجا در برنامه کلاینت در C# یک نمونه از شی RemoteType, RemoteTime ایجاد م یکنیم و متد getTime را فراخوانی میکنیم. به علاوه آن از فیال Client.exe.config برای اطلاعات ارتباطاتی برای چارچوب Remoting استفاده می کند.
using System;
using System.Runtime.Remoting;
public class Client
{
public static void Main()
{
RemotingConfiguration.Configure("Client.exe.config");
RemoteTime remoteTimeObject = new RemoteTime();
Console.WriteLine(remoteTimeObject.getTime());
}
}
همچنین بایستی فایل پیکربندی اضافی برای ارائه اطلاعات ارتباطی به Client Object ایجاد کنیم. فایل به فرمت xml است. در آن می توان Remote Type, channel, port و ... را مشخص کرد.
<configuation>
<system.runtime.remoting>
<application>
<client>
<wellknown type="RemoteTime,RemoteTime" url="http://localhost:9090/RemoteTime.rem"/>
</client>
</application>
</system.runtime.remoting>
</configuation>