您好,登錄后才能下訂單哦!
今天研究了一下Castle的Remoting Facility.記錄如下:
微軟以前使用COM/DCOM的技術來處理分布式系統架構,通過Client端的Proxy代理程序來呼叫遠程Server機器上的對象。.NET Framework則使用.NET Remoting或Web Services技術來實作分布式處理的工作概念;在這里針對.NET Remoting的設計架構做一個初步的簡介和Castle整合示例。
.NET Framework提供了多種的機制來支持Remoting,如:
.利用Channel來負責信息的發送與接收。
.利用Formatter來負責在信息要通過channel發送出去之前,先將信息做適當的加密,或于信息在通過Channel接收進來之后,先將信息做相對的解密工作。
.利用Proxy來呼叫遠程的對象執行所要的功能呼叫。
其關系如下圖所示:
Channel 和 Formatter
在遠程對象被使用之前,必須先在Server端注冊好信息發送的信道(Channel),這些Channel可通過.NET Remotin configuration file或 ChannelServices對象類別的RegisterChannel方法來注冊。
在Channel的使用上,.NET Framework支持HTTP、TCP及SMTP等通道。若使用HTTP Channel ,則使用SOAP協議來收送信息,所有的信息會被發送到SOAP Formatter中,被序列化(serialized)成XML的格式,而SOAP所需的headers也會被加入。至于使用TCP Channel者,則使用TCP協議來將信息發送到Binary Formatter中,以Binary Stream的方式來將信息發送到URI目的地。(URI : Universal Resource Identifier,類似大家所熟悉的URL)。
Activation and Proxy
Server-Side Activation
Server端在Client端要獲取Remoting對象時必需在Server端能自動啟動Remoting對象,可使用RemotingConfiguration對象類別的RegisterWellKnownServiceType方法來完成這項工作。
Client-Side Activation
Client端要使用遠程對象之前,可使用New 或Activator 對象類別所提供的CreateInstance或GetObject方法來啟動對象并傳回Proxy,以便Client端可通過Proxy來執行叫用遠程對象的方法。
范例
以下分三個步驟來介紹
1. 建立Remoting對象
2. 在Server上初始Remoting物件
3. Client端使用Remoting對象
步驟1:建立Remoting對象
建立一個MathServer對象類別,提供Sum方法,可給予一連串的整數由Sum方法代為計算總和。程序代碼如下,并說明于后:
using System;
namespace RemoteSample.Components
{
/// <summary>
/// Class1 的摘要說明。
/// </summary>
public interface IRemoteMath
{
int Sum(params int[] a);
int CallCounter
{
get;
}
}
}
using System;
using RemoteSample.Components;
namespace RemoteSample.Components
{
/// <summary>
/// RemoteMath 的摘要說明。
/// </summary>
public class RemoteMath: MarshalByRefObject,IRemoteMath
{
private int callCounter = 0;
public RemoteMath()
{
}
#region 接口IRemoteMath的成員實現
/// <summary>
/// 求和計算
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public int Sum(params int[] a)
{
int sum = 0;
for (int i = 0; i <= a.Length - 1; i++)
{
sum += a[i];
}
callCounter += 1;
return sum;
}
public int CallCounter
{
get
{
return this.callCounter;
}
}
#endregion
}
}
說明:Remoting對象必須繼承自MarshalByRefObject,這樣才能通過網絡,將對象執行個體的參考位置傳遞給呼叫端。
步驟2:在Server上初始化Remoting對象,程序代碼如下,并說明于后:
namespace RemoteSample.Server
{
class RemoteServerMain
{
[STAThread]
internal static void Main(string[] args)
{
IWindsorContainer container = new RemotingContainer();
Console.ReadLine();
}
}
}
ServerConfig.xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility id="remote.facility" type="Castle.Facilities.Remoting.RemotingFacility, Castle.Facilities.Remoting"
remotingConfigurationFile ="../../RemotingTcpConfig.config"
isServer="true"
registryUri="kernel.rem" >
</facility>
</facilities>
<components>
<component
id="remote.math"
service="RemoteSample.Components.IRemoteMath, RemoteSample.Components"
type="RemoteSample.Components.RemoteMath, RemoteSample.Components"
remoteserver="component" >
</component>
</components>
</configuration>
RemotingTcpConfig.config文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="2133" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
說明:
使用Castle 的Remoting Facillity 使用Remoting 。
1.配置指出在2133 port上要建立TCP Channel, 2133 port上要建立tcp Channel
2.<components>指出在Server端注冊所要使用的組件、服務的名稱及啟動的方式。其中component表示一個執行個體可供多個前端來呼叫,可保留其狀態,另一種則為ClientActivated,一個執行個體只能服務一個前端的呼叫,無法保留其狀態。
步驟3:在Client端使用Remoting對象
ClientConfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<facilities>
<facility
id="remote.facility"
type="Castle.Facilities.Remoting.RemotingFacility, Castle.Facilities.Remoting"
remotingConfigurationFile="../../RemotingTcpConfigClient.config"
isClient="true"
remoteKernelUri="tcp://localhost:2133/kernel.rem"
baseUri="tcp://localhost:2133" >
</facility>
</facilities>
<components>
<component
id="remote.math"
service="RemoteSample.Components.IRemoteMath, RemoteSample.Components"
type="RemoteSample.Components.RemoteMath, RemoteSample.Components"
remoteclient="component" />
</components>
</configuration>
RemotingTcpConfigClient.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
程序代碼如下:
namespace RemoteSample.Client
{
/// <summary>
/// RemoteClient的摘要說明。
/// </summary>
public class RemoteClientMain
{
[STAThread]
static void Main(String[] args)
{
IWindsorContainer container = new RemotingContainer();
IRemoteMath remoteMath = (IRemoteMath)container[typeof(IRemoteMath)] ;
Console.WriteLine("Client1 TCP Call Sum method {0} Counter {1}",remoteMath.Sum(10, 20, 30),remoteMath.CallCounter);
Console.WriteLine("....press a key to stop");
Console.ReadLine();
}
}
}
新航道雅思
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。