天天看點

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的構架圖:

Net Remoting和Web Service大比拼

                                                       圖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看起來就象是調用本地對象一樣。

Net Remoting和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協定來發送和接收資訊。我們可以非常容易地通過加入定制的屬性來控制這一切。

轉載于:https://www.cnblogs.com/dream844/archive/2012/06/07/2540244.html

繼續閱讀