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

微軟的.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框架的使用(原創)
Microsoft .NET Remoting 提供了一種允許對象通過應用程序域與另一對象進行交互的框架。其目的之一是爲了提供一種必要的基礎接口,一隱藏遠程對象調用的方法和返回結果的複雜性。下面就來介紹該框架的使用方法: ...查看完整版>>.NET Remoting框架的使用(原創)
 
微軟 .NET Remoting體系結構評估
  概述  .NET Remoting 被譽爲管理應用程序域之間的 RPC 的首選技術。應用程序域是公共語言運行庫的隔離單元,它們是在進程內創建並運行的。這與 CLR 和非 CLR 托管的進程之間的進程間通信(互操作)不同。後一種...查看完整版>>微軟 .NET Remoting體系結構評估
 
基于.NET數字處理程序的框架設計
接觸數字圖像處理最早是在高中,那時候PHOTOSHOP還是4.0,可能是因爲先入爲主的關系,到現在都沒有學3DMAX之類的興趣,2D到3D的飛躍估計是沒我什麽事了,舍不得那平方到立方的高薪....呵呵。在上大學的時候,就和同學...查看完整版>>基于.NET數字處理程序的框架設計
 
消息與.Net Remoting的分布式處理架構
  分布式處理在大型企業應用系統中,最大的優勢是將負載分布。通過多台服務器處理多個任務,以優化整個系統的處理能力和運行效率。分布式處理的技術核心是完成服務與服務之間、服務端與客戶端之間的通信。 ...查看完整版>>消息與.Net Remoting的分布式處理架構
 
消息與.Net Remoting的分布式處理架構
  分布式處理在大型企業應用系統中,最大的優勢是將負載分布。通過多台服務器處理多個任務,以優化整個系統的處理能力和運行效率。分布式處理的技術核心是完成服務與服務之間、服務端與客戶端之間的通信。 ...查看完整版>>消息與.Net Remoting的分布式處理架構
 
Microsoft .Net Remoting系列專題之三:Remoting事件處理全接觸
前言:在Remoting中處理事件其實並不複雜,但其中有些技巧需要你去挖掘出來。正是這些技巧,仿佛森嚴的壁壘,讓許多人望而生畏,或者是不知所謂,最後放棄了事件在Remoting的使用。關于這個主題,在網上也有很多討論...查看完整版>>Microsoft .Net Remoting系列專題之三:Remoting事件處理全接觸
 
微軟.net精簡框架常見問題及回答(中文版)
最常見問題(FAQ)微軟.net精簡框架最常見問題。 此FAQ的內容,一部分來自 (microsoft.public.dotnet.framework.compactframework)張貼和回答的問題。.net精簡框架開發小組感謝每一位參與新聞組的人事,感謝他們對FAQ...查看完整版>>微軟.net精簡框架常見問題及回答(中文版)
 
微軟.NET框架簡介
微軟將其對于未來計算的設想命名爲.NET(dot-net)。微軟認爲未來的計算將是多個應用程序通過Internet以一種分布式的方式運行的世界。我們可以找出很多驅動這種設想的來自不同方面的動力。 首先,分布式計算和面...查看完整版>>微軟.NET框架簡介
 
探討與比較Java和.NET的事件處理框架
探討與比較Java和.NET的事件處理框架
事件驅動模型  事件驅動模型是軟件系統平台中的一個重要區域,現代軟件系統大量地使用事件驅動的處理方法,尤其在用戶界面方面。雖然如此,過去在軟件開發語言中一直沒有融入事件處理的因子,直到.net的出現,才將...查看完整版>>探討與比較Java和.NET的事件處理框架
 
 
回到王朝網路移動版首頁