Net Remoting和Web Service大比拼


隨着.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協議來發送和接收信息。我們可以非常容易地通過加入定制的屬性來控制這一切。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM