.Net Remoting和Web Service大比拼

作者:IT168 極地聖火  2008-01-25

【IT168 專稿】

    隨着.NET的推出,微軟引入了一套新的通訊技術:Web Services和.NET remoting。.NET remoting和ASP.NET Web Services可以爲建立分佈式的應用提供強有力的支持。因此,爲了在我們的應用程序中選擇合適的技術,充分理解這兩種技術的工作原理是非常必要的。
    Web Service技術使用了HTTP、XML和SOAP技術進行通 訊,因此,Web Service是跨平臺的和真正的跨越防火牆的B2B應用集成技術。由於Web Services需要依賴商業標準在Internet上提供服務,因此,這種技術是語言、平臺和設備獨立的。Remoting技術可以允許程序和軟件通過 應用程序域、進程和不同機器之間進行交互。這將使我們的應用程序可以使用在網絡環境中的遠程資源。
    Web Services和remoting技術都支持開發分佈試的應用程序和應用程序集成,但是我們需要考慮的是它們有哪些不同。在本文中將給出這兩種技術的不同點,併爲每一種實現給出實例以供讀者更深入地理解這兩種技術。

一、.NET Remoting 概述
 
.NET Remoting使用了一種非常有彈性的擴展性的框架。Remoting使用了.NET的一個應用程序域(AppDomain)的概念來確定它的活動性。AppDomain是一個抽象的結構,用來保證數據和代碼的隔離,但並不依賴於操作系統的特殊概念,如進程或線程。一個進程可以包含多個AppDomains,但是一個AppDomain只能存在於一個進程。如果在程序中通過AppDomain調用,那麼.NET Remoting將獲得這個位置。如果一個對象位於同一個AppDomain中,那麼這個對象被認爲是本地的對象。

   
.NET remoting中,所有繼承於System.MarshalByRefObject的類的對象都被視爲遠程對象。MarshalByRefObject類提供了通過應用程序域訪問遠程對象的基本功能。在.NET remoting中,客戶端不會直接調用方法,而是使用一個協議對象作爲中轉來調用遠程對象中的方法。每一個在遠程對象中定義的public方法都可以被客戶端調用。圖1.Net Remoting的構架圖:


                    圖1
    當 客戶端調用遠程方法時,代理首先會接收這個調用。並使用一個適當的格式來對這些調用信息進行編碼,然後通過Channel將調用送到服務器。在服務端 AppDomain的一個Channel接收了這個請求,並將這個請求交給了適當的Remoting對象處理,並調用響應的方法。一位執行完方法,方法的 返回值就會被送回到客戶端。
    Remoting框架由兩種格式組成:二進制和SOAP格式。二進制格式是非常快的,並以適當的二進制格式來對方法進行編碼調用。SOAP格式要比二進制格式慢,但是它允許開發人員使用SOAP格式來對遠程信息進行編碼。至於使用哪種方式,開發人員可以根據自己的需要決定。
二、遠程對象的不同類型
    遠程構架允許我們建立兩個不同類型的遠程對象。
 
   1. 客戶端對象:這種類型的遠程對象是一個在客戶端進行創建和銷燬的服務端對象。這種遠程對象的實例在客戶端調用服務端對象的一個新操作時創建。對象實例的生命週期和客戶端有關。一但客戶端不太需要遠程對象後,這個對象就會被垃圾回收器回收。
2. 服務端對象:這種對象的生命週期被遠程服務器管理,而並不是由客戶端創建的對象。這種對象和客戶端對象的區別是當對象完成工作後,遠程對象由客戶端控制。 也就是說,當客戶端調用新的遠程對象或是Activator.GetObject時,服務端對象並不被創建。有兩種類型的服務端對象。它們是:
    (1) 獨享調用:這種調用方式對於一個客戶端的請求只使用一個新的遠程對象。在處理完客戶端請求後,這個遠程對象就會被垃圾回收器回收。因此,這個遠程對象並不會在兩個或以上的客戶端請求中共享。
    (2)
共享調用:這種調用方式和獨享調用的區別是這種方式可以在不同請求之間共享遠程對象實例,而獨享調用對每一個客戶端請求創建一個單獨的遠程對象。

三、ASP.NET Web Services概述
    在.NET中建立一個ASP.NET Web Service是一項非常簡單的工作。爲了建立一個Web Service,我們需要建立一個Web Service類,這個類從System.Web.Services.WebService繼承,並使用WebMethod屬性公開一些Web Service方法。一但這項工作做完。這些方法就可以通過SOAP和HTTP協議進行調用。
    使用一個Web Service也是非常簡單和直接的。我們可以使用wsdl.exe或使用VS.NET的開發環境建立一個代理類。這個代理隱藏了調用了Web Service的複雜性,並使Web Service看起來就象是調用本地對象一樣。




   
我們可以從上圖看到。客戶端代理從客戶端接收到了請求,並將這個請求序列化成SOAP請求,並送到遠程Web Service中。遠程Web Service接收到SOAP請求後,開始執行這個方法,並以SOAP響應的形式將結果送回到客戶端的代理,客戶端代理對這些返回信息進行反序列化,並送給實際的客戶端。

四、ASP.NET Web Services NET Remoting的對比
 
    現在我們已經理解了.NET remoting和Web Services的基本概念。現在讓我們來看看這兩種技術有什麼具體的不同。爲了這個目的,我將它們的不同分爲性能、狀態管理等方面進行闡述。
1.  性能
 
從性能方面,.NET remoting在使用TCP通道和二進制格式時擁有更快的通訊速度。而關於Web Services的主要焦點就集中在性能上。由於XML的冗長而使得用SOAP協議序列化出來的傳輸數據要比二進制數據流更慢。另外,處理字符串要比直接 處理二進制更慢。然而,如果我們的Web service要進行的工作主要是計算操作,可以在服務端使用緩衝技術來增加web service的性能。
    如 果我們使用一個SOAP格式的.NET remoting,我們會發現ASP.Net Web Service的性能會比使用SOAP協議的.NET remoting(可以使用http或tcp同道)更好。因此,.NET remoting技術只有在使用TCP通道和二進制格式時才比Web service的性能更高。

2. 狀態管理
 
    Web services是一種無狀態的編程模型,這就意味着需要單獨處理 每一個請求。另外,客戶端每一次調用web services,服務端會爲這個請求建立一個新的對象。這個對象在所有的方法調用完後銷燬。爲了在請求之間維護狀態,我們可以使用和ASP.NET頁同 樣的技術。如Session和Application對象,或是爲我們的解決方案定製一個解決方案。但我們要清楚的是,在Web Service中維護狀態的成本是非常高的。
    .NET remoting支持多種方式的狀態管理。我們可以從中選擇適當 的解決方案。在前面提到過,SingleCall對象是無狀態的,Singleton對象可以共享所有客戶端的狀態,並且客戶對象在每一個客戶端維護狀 態。如果我們不需要維護狀態,可以使用singlecall對象,如果我們需要維護狀態,可以一起使用singlecall和singleleton對 象。
 
3.  安全
    .NET remoting並不支持跨平臺的安全調用。但由於.NET remoting對象運行在IIS中,因此可以使用IIS的所有的安全特性。如果我們在其它的非IIS容器中使用TCP或HTTP通道,那麼我們必須自已實現驗證,授權等機制。
    web service和.NET remoting一樣,也運行在IIS中,同樣也可以使用IIS所提供的安全機制,如SSL、授權等。

4. 可靠性
    .NET remoting可以將任何程序作爲遠程對象,如Windows Form、服務程序、控制檯或ASP.NET工作進程等。如果我們將Windows服務或控制檯程序作爲遠程對象,那麼我們需要確認所提供的服務特性是否 符合遠程對象的要求。然而如果我們在IIS中提供遠程對象,那麼我們可以利用ASP.NET工作進程的兩個特性:自動開始和線程安全。對於ASP.NET Web service來說,可靠性並不是經常需要考慮的因素,因此它可以利用IIS在這方面的能力。
 
5. 可擴展性
 
    ASP.NET Web services.NET remoting框架都是可擴展的。我們可以過濾內部和外部的信息,控制各種類型的組件和元數據的產生。.NET remoting可以擴展到下一層,以允許我們實現自己的格式化程序和通道。
    ASP.NET Web services
依賴於System.Xml.Serialization.XmlSerializer類通過SOAP協議來發送和接收信息。我們可以非常容易地通過加入定製的屬性來控制這一切。

五、實例

    在這部分,我們將使用一個簡單的例子來演示如何編寫Web Services和遠程對象。下面我們通過一個簡單的遠程對象開始我們的學習。

1. 建立一個遠程對象
 
    爲了建立這個遠程對象,我們需要寫一個從MarshalByRefObject繼承的。代碼如下如示:

using System;
namespace
RemoteClassLib
{
public class
MyRemoteObject : System.MarshalByRefObject
{
public
MyRemoteObject()
{
Console.WriteLine(
"Constructor called"
);
}
public string Hello(string
name)
{
Console.WriteLine(
"Hello Called"
);
return "Hello " +
name;
}
}
}

上面的代碼非常簡單和直接。一開始有一個從MarshalByRefObject.繼承的類。然後我們加入了這個類的構造方法,並將一條信息輸出到控制檯。然後我們寫一個Hello方法用於返回一個值。一但這個遠程對象被建立,下一步就是建立一個控制檯應用程序來從配置文件中讀遠程對象的信息。

using System;
using
System.Runtime.Remoting;
namespace
RemoteClassLibServer
{
class
RemoteServer
{
[STAThread]
static void Main(string
[] args)
{
RemotingConfiguration.Configure(
"RemoteClassLibServer.exe.config"
);
Console.WriteLine(
"Press return to Exit"
);
Console.ReadLine();
}
}
}

 

在上面的main方法中,我們只是使用RemotingConfiguration.Configure方法從配置文件中讀入配置信息。並等待客戶端連接它。上面所使用的配置文件的形式如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<system.runtime.remoting>
<application name="RemoteClassLibServer">
<service>
<wellknown mode="SingleCall"
type
="RemoteClassLib.MyRemoteObject,RemoteClassLib"

objectUri
="MyRemoteObject">
</wellknown>
</service>
<channels>
<channel ref="tcp server" port="9000"/>
</channels>

</application>
</system.runtime.remoting>
</configuration>

一但服務器程序被啓動,然後這個客戶端應用程序就可以開始建立遠程對象的實例,並且調用相應的方法。在下一部分,我們將理解建立ASP.NET web services的過程。

2. 建立一個ASP.NET Web Service
 
    在前面曾提及,使用VS.NET建立一個ASP.NET Web Service是非常容易的。只需要使用ASP.NET Web Service模板建立一個Web Service工程。並輸入工程名。一位工程被建立。將service1.asmx文件的內容爲如下的形式:

using System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data;
using
System.Diagnostics;
using
System.Web;
using
System.Web.Services;
namespace
XmlWebServicesExample
{
public class
Service1 : System.Web.Services.WebService
{
public
Service1()
{
}
[WebMethod (EnableSession
=true
)]
public string
HelloWorld()
{
return "Hello World"
;
}
}
}

 我們可以從上面的代碼看出,Web Service類名爲Service1,從System.Web.Services.WebService繼承。從WebService類繼承是可選的, 這主要是爲了可以訪問類似的ASP.NET對象,如Application、Session、User和Context。然後我們還加入了一個叫 HelloWorld的方法,這個方法返回一個簡單的字符串給Web Service的調用者。在HelloWorld方法的WebMethod屬性中,我們還通過EnableSessionn屬性指定ASP.NET Web service的會話狀態爲打開。
六、結論
 
    .NET remoting和ASP.NET Web Service都是非常強大的技術,這兩種技術都提供了適當的框架來開發分佈式的應用程序。充分理解這兩種技術如何工作,並如何正確選擇它們是非常重要 的。如果應用程序要求互操作性,並且必須在公共網絡中,Web Services將是最好的選擇。如果要求和其他的.NET組件進行通訊,並且性能非常關鍵,那麼.NET Remoting技術是最好的選擇。總而言之,當我們需要從不同的計算平臺發送和接收數據時,使用Web Service,而需要在.NET應用程序之間進行通訊時,就需要使用.NET remoting技術。在一些應用環境中,我們可以將Web Service和.NET remoting聯合起來使用。這樣會有更好的效果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章