| 導購 | 订阅 | 在线投稿
分享
 
 
 

微軟的遠程處理框架.NET Remoting

來源:互聯網  2006-12-16 17:29:37  評論

微軟的.NET Remoting提供了一種允許對象通過應用程序域與另一對象進行交互的框架。本文將通過兩個具體的代碼例子介紹它的特性,通過.NET Remoting,兩個應用間的通信將變得非常簡單,使用上也相當靈活。

最近幾年來,在計算機世界中,關于「向外擴展」(scale-out)與「向上擴展」(scale-up)的討論不斷,並且有向scale-out轉化的趨勢。在以前,當計算機跟不上應用對性能的要求時,人們將會購買一台更好更昂貴的機器,這就是scale-up,而scale-out則是通過在網絡中加入更多的機器來解決這個問題,這樣就無需更換整個系統。通過將計算的負擔分配在多個系統中,整個系統就有了更高的可用性。

如果將這個scale-out的意念更推進一步,我們可能會發現:爲什麽要將諸如信用卡驗證和運送跟蹤的處理放在我們的系統呢?如果能夠調用售賣者的應用來直接得到這些服務,豈不可以做得更爲簡單嗎?如果能做到這一點,我們就可以擴展自己程序的功能,而無需再加入額外的硬件。值得注意的是,這樣做將會另ISV(獨立軟件開發商)的角色由一個軟件提供者,轉變爲一個服務提供者。

這個想法很好,但是目前的技術要實現它的話,存在著不少的問題。DCOM在跨防火牆工作時會有問題。DCOM是建立在私有協議上的,而CORBA存在有多種不同接口的問題。如果將DCOM和CORBA放在一起工作呢,就更麻煩了。

爲了實現這個scale-out的想法,我們需要一個組件技術,它可以跨越多種類型的網絡和多種協議無縫地工作。遠程.NET就可以做到這一點。

這個無縫的交互是通過使用XML和SOAP來實現的。不過,它並沒有認定SOAP進行組件交互的唯一方法,它也並沒有認定HTTP或者TCP/IP是用來連接這些服務的網絡協議。這樣可令遠程架構更加靈活,並且可適應協議和網絡的變化。

.NET架構是使用channel對象將應用連接在一起的。.NET架構提出了兩種channel,它們是:

System.Runtime.Remoting.Channels.TCP

System.Runtime.Remoting.Channels.HTTP

TCP channel和現有的DCOM非常類似,可提供很高的性能,在機器都處在一個內部網絡時,可選用TCP channel,而HTTP channel使用HTTP協議,可讓應用在Internet上交互。由于它使用的是HTTP協議,它可以很容易地做到負載均衡,並且能通過防火牆。

以下我們將舉一個使用channel的例子。在這個例子中,我們將可以看到使用HTTP channel把兩個應用

連接在一起是如此的簡單。以下的服務器應用提供了一個服務,可將一個字符串的字母順序反轉。

Server.cs using System;

using System.IO;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels.HTTP;

namespace RemotingSample

{

public class Reverser : MarshalByRefObject

{

public string Reverse(string text)

{

Console.WriteLine("Reverse({0})", text);

string rev = "";

for (int i=text.Length-1; i>=0; i--)

{

rev += text[i];

}

Console.WriteLine("returning : {0}", rev);

return rev;

}

}

public class TheApp

{

public static void Main()

{

file:// Create a new HTTP channel that

// listens on port 8000

HTTPChannel channel = new HTTPChannel(8000);

// Register the channel with the runtime

ChannelServices.RegisterChannel(channel);

// Expose the Reverser object from this server

RemotingServices.RegisterWellKnownType(

"server", // assembly name

"RemotingSample.Reverser", // full type name

"Reverser.soap", file:// URI

WellKnownObjectMode.Singleton // instancing mode

);

// keep the server running until

// the user presses enter

Console.WriteLine("Server.exe");

Console.WriteLine("Press enter to stop server...");

Console.ReadLine();

}

}

}

現在我們已經擁有了一個字符反向服務,以下我們將建立一個客戶應用來使用這個服務:

Client.cs using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels.HTTP;

using RemotingSample; // reference the server

public class TheApp

{

public static void Main()

{

// Create and register a channel

// to comunicate to the server.

// The client will use port 8001

// to listen for callbacks

HTTPChannel channel = new HTTPChannel(8001);

ChannelServices.RegisterChannel(channel);

// create an instance on the remote server

// and call a method remotely

Reverser rev = (Reverser)Activator.GetObject(

typeof(Reverser), // type to create

"http://localhost:8000/Reverser.soap" file:// URI

);

Console.WriteLine("Client.exe");

Console.WriteLine(rev.Reverse("Hello, World!"));

}

}

||||||看,通過遠程.NET將兩個應用連接在一起是多麽的簡單。當服務端和客戶端程序放在兩台不同的機器時,我們可以令兩個程序都運行在80端口。這樣遠程的調用就可通過一個防火牆。你也可將HTTPChannel改爲一個TCPChannel試一下。

你要注意到,客戶端是通過「Reverser.soap」來標識它想連接的對象的。這個名字與服務器代碼中RegisterWellKnownType的URI參數符合。「.soap」的擴展是不必要的。URI可以是任何的字符串,只要它能唯一標識服務器的對象就可以了。「.soap」的擴展只是用來提醒我們HTTP channel是使用soap來格式化信息的。

在上面有關channel的例子中,你可能會産生這樣的疑問:參數是如何跨網絡傳送,返回值又是如何送回的呢?答案是,在參數被跨網絡傳送之前,他們必須經過串行化處理。對于需要傳送的所有對象或者結構,都要經過這樣的處理。串行化的處理很簡單,只是以連續字節的方式建立變量或者對象中的數據的一個持續拷貝。將這些字節還原爲一個值或者對象實例的處理被稱爲反串行化。

那麽參數是如何串行化的呢?遠程.NET架構爲我們提供了一個稱爲格式器(formatters)的對象集。格式器可將一個對象變成是一個特定的持續數據格式,也可以將該它還原回來。.NET爲我們提供了兩種格式器:

System.Runtime.Serialization.Formatters.Binary

System.Runtime.Serialization.Formatters.SOAP

binary(二進制)格式器是最簡單的。它只是將數據直接轉換爲一個字節流。SOAP格式器使用一個XML來保持一個對象數據。要知道SOAP更詳細的信息,可到http://www.soapwebservices.com。

以下我們舉一個有關格式器的簡單例子。我們將使用SOAP格式器,由于它使用的是XML,我們可以很容易地讀出串行化的數據。

Soap.cs using System;

using System.IO;

using System.Runtime.Serialization.Formatters.Soap;

public class Person

{

public string FirstName = "David";

public string LastName = "Findley";

private int Age = 29;

}

public class TheApp

{

public static void Main()

{

Stream stream = File.Create("example.xml");

SoapFormatter formatter = new SoapFormatter();

Person p = new Person();

// persist an integer

formatter.Serialize(stream, 5);

file:// persist a string

formatter.Serialize(stream, "This is a string");

// persist an object

formatter.Serialize(stream, p);

stream.Close();

}

}

對于每個串行化的調用,example.xml的內容將有三個不同的部分:

Example.xml

<SOAP-ENV:Body>

<xsd:int id="ref-1">

<m_value>5</m_value>

</xsd:int>

</SOAP-ENV:Body>

<SOAP-ENV:Body>

<SOAP-ENC:string id="ref-1">This is a string</SOAP-ENC:string>

</SOAP-ENV:Body>

<SOAP-ENV:Body>

<a1:Person id="ref-1">

<FirstName id="ref-3">David</FirstName>

<LastName id="ref-4">Findley</LastName>

<Age>29</Age>

</a1:Person>

</SOAP-ENV:Body>

你可以看出,它可以串行化基本值類和對象。HTTPChannel使用SOAP格式器在客戶和服務器之間傳送數據。

總的來說,格式器可以格式和保持值或者對象的數據。Channel傳送和接收數據。通過channel和格式器的協同工作,我們將可以使用任何的網絡和協議來連接兩個應用。

微軟的.NET Remoting提供了一種允許對象通過應用程序域與另一對象進行交互的框架。本文將通過兩個具體的代碼例子介紹它的特性,通過.NET Remoting,兩個應用間的通信將變得非常簡單,使用上也相當靈活。   最近幾年來,在計算機世界中,關于「向外擴展」(scale-out)與「向上擴展」(scale-up)的討論不斷,並且有向scale-out轉化的趨勢。在以前,當計算機跟不上應用對性能的要求時,人們將會購買一台更好更昂貴的機器,這就是scale-up,而scale-out則是通過在網絡中加入更多的機器來解決這個問題,這樣就無需更換整個系統。通過將計算的負擔分配在多個系統中,整個系統就有了更高的可用性。   如果將這個scale-out的意念更推進一步,我們可能會發現:爲什麽要將諸如信用卡驗證和運送跟蹤的處理放在我們的系統呢?如果能夠調用售賣者的應用來直接得到這些服務,豈不可以做得更爲簡單嗎?如果能做到這一點,我們就可以擴展自己程序的功能,而無需再加入額外的硬件。值得注意的是,這樣做將會另ISV(獨立軟件開發商)的角色由一個軟件提供者,轉變爲一個服務提供者。   這個想法很好,但是目前的技術要實現它的話,存在著不少的問題。DCOM在跨防火牆工作時會有問題。DCOM是建立在私有協議上的,而CORBA存在有多種不同接口的問題。如果將DCOM和CORBA放在一起工作呢,就更麻煩了。   爲了實現這個scale-out的想法,我們需要一個組件技術,它可以跨越多種類型的網絡和多種協議無縫地工作。遠程.NET就可以做到這一點。   這個無縫的交互是通過使用XML和SOAP來實現的。不過,它並沒有認定SOAP進行組件交互的唯一方法,它也並沒有認定HTTP或者TCP/IP是用來連接這些服務的網絡協議。這樣可令遠程架構更加靈活,並且可適應協議和網絡的變化。   .NET架構是使用channel對象將應用連接在一起的。.NET架構提出了兩種channel,它們是:   System.Runtime.Remoting.Channels.TCP   System.Runtime.Remoting.Channels.HTTP   TCP channel和現有的DCOM非常類似,可提供很高的性能,在機器都處在一個內部網絡時,可選用TCP channel,而HTTP channel使用HTTP協議,可讓應用在Internet上交互。由于它使用的是HTTP協議,它可以很容易地做到負載均衡,並且能通過防火牆。 以下我們將舉一個使用channel的例子。在這個例子中,我們將可以看到使用HTTP channel把兩個應用 連接在一起是如此的簡單。以下的服務器應用提供了一個服務,可將一個字符串的字母順序反轉。   Server.cs using System;   using System.IO;   using System.Runtime.Remoting;   using System.Runtime.Remoting.Channels.HTTP;   namespace RemotingSample   {    public class Reverser : MarshalByRefObject    {     public string Reverse(string text)     {      Console.WriteLine("Reverse({0})", text);      string rev = "";      for (int i=text.Length-1; i>=0; i--)      {       rev += text[i];       }      Console.WriteLine("returning : {0}", rev);      return rev;     }    }    public class TheApp    {     public static void Main()     {      file:// Create a new HTTP channel that      // listens on port 8000      HTTPChannel channel = new HTTPChannel(8000);      // Register the channel with the runtime      ChannelServices.RegisterChannel(channel);      // Expose the Reverser object from this server      RemotingServices.RegisterWellKnownType(          "server", // assembly name          "RemotingSample.Reverser", // full type name          "Reverser.soap", file:// URI          WellKnownObjectMode.Singleton // instancing mode       );      // keep the server running until      // the user presses enter      Console.WriteLine("Server.exe");      Console.WriteLine("Press enter to stop server...");      Console.ReadLine();     }    }   }   現在我們已經擁有了一個字符反向服務,以下我們將建立一個客戶應用來使用這個服務:    Client.cs using System;    using System.Runtime.Remoting;    using System.Runtime.Remoting.Channels.HTTP;    using RemotingSample; // reference the server    public class TheApp     {      public static void Main()      {       // Create and register a channel       // to comunicate to the server.       // The client will use port 8001       // to listen for callbacks       HTTPChannel channel = new HTTPChannel(8001);       ChannelServices.RegisterChannel(channel);       // create an instance on the remote server       // and call a method remotely       Reverser rev = (Reverser)Activator.GetObject(          typeof(Reverser), // type to create          "http://localhost:8000/Reverser.soap" file:// URI          );       Console.WriteLine("Client.exe");       Console.WriteLine(rev.Reverse("Hello, World!"));      }     }           ||||||看,通過遠程.NET將兩個應用連接在一起是多麽的簡單。當服務端和客戶端程序放在兩台不同的機器時,我們可以令兩個程序都運行在80端口。這樣遠程的調用就可通過一個防火牆。你也可將HTTPChannel改爲一個TCPChannel試一下。   你要注意到,客戶端是通過「Reverser.soap」來標識它想連接的對象的。這個名字與服務器代碼中RegisterWellKnownType的URI參數符合。「.soap」的擴展是不必要的。URI可以是任何的字符串,只要它能唯一標識服務器的對象就可以了。「.soap」的擴展只是用來提醒我們HTTP channel是使用soap來格式化信息的。   在上面有關channel的例子中,你可能會産生這樣的疑問:參數是如何跨網絡傳送,返回值又是如何送回的呢?答案是,在參數被跨網絡傳送之前,他們必須經過串行化處理。對于需要傳送的所有對象或者結構,都要經過這樣的處理。串行化的處理很簡單,只是以連續字節的方式建立變量或者對象中的數據的一個持續拷貝。將這些字節還原爲一個值或者對象實例的處理被稱爲反串行化。   那麽參數是如何串行化的呢?遠程.NET架構爲我們提供了一個稱爲格式器(formatters)的對象集。格式器可將一個對象變成是一個特定的持續數據格式,也可以將該它還原回來。.NET爲我們提供了兩種格式器:   System.Runtime.Serialization.Formatters.Binary   System.Runtime.Serialization.Formatters.SOAP binary(二進制)格式器是最簡單的。它只是將數據直接轉換爲一個字節流。SOAP格式器使用一個XML來保持一個對象數據。要知道SOAP更詳細的信息,可到http://www.soapwebservices.com。 以下我們舉一個有關格式器的簡單例子。我們將使用SOAP格式器,由于它使用的是XML,我們可以很容易地讀出串行化的數據。   Soap.cs using System;   using System.IO;   using System.Runtime.Serialization.Formatters.Soap;   public class Person   {    public string FirstName = "David";    public string LastName = "Findley";    private int Age = 29;   }   public class TheApp   {    public static void Main()    {     Stream stream = File.Create("example.xml");     SoapFormatter formatter = new SoapFormatter();     Person p = new Person();     // persist an integer     formatter.Serialize(stream, 5);     file:// persist a string     formatter.Serialize(stream, "This is a string");     // persist an object     formatter.Serialize(stream, p);     stream.Close();    }   }   對于每個串行化的調用,example.xml的內容將有三個不同的部分:   Example.xml   <SOAP-ENV:Body>   <xsd:int id="ref-1">   <m_value>5</m_value>   </xsd:int>   </SOAP-ENV:Body>   <SOAP-ENV:Body>   <SOAP-ENC:string id="ref-1">This is a string</SOAP-ENC:string>   </SOAP-ENV:Body>   <SOAP-ENV:Body>   <a1:Person id="ref-1">   <FirstName id="ref-3">David</FirstName>   <LastName id="ref-4">Findley</LastName>   <Age>29</Age>   </a1:Person>   </SOAP-ENV:Body> 你可以看出,它可以串行化基本值類和對象。HTTPChannel使用SOAP格式器在客戶和服務器之間傳送數據。   總的來說,格式器可以格式和保持值或者對象的數據。Channel傳送和接收數據。通過channel和格式器的協同工作,我們將可以使用任何的網絡和協議來連接兩個應用。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有