ASP.NET Web 服務還是 .NET Remoting:如何選擇(MSDN)

來源:互聯網
上載者:User
概述

隨著時間的推移,已經形成這樣一種慣例:即將應用程式構建成一組組件,分佈於電腦網路之間,並作為整個程式的一部分一起運行。過去,分布式應用程式邏輯需要具備組件/對象技術,例如,Microsoft 分散式元件物件模型 (DCOM)、Object Management Group 的公用對象請求代理程式體繫結構 (CORBA) 或 Sun 的遠程方法調用 (RMI)。這些技術提供了可靠的、可升級的體繫結構,以滿足對應用程式日益增長的需要。

儘管這些基於組件的技術在 Intranet 環境中運行良好,但如果試圖將其應用到 Internet 上,則會遇到兩個大的問題。首先,這些技術不能進行互動操作。雖然這些技術都能處理對象,但在細節上卻不盡相同。例如,生命週期管理、對建構函式的支援以及對繼承的支援程度。第二,更重要的是,它們都著眼於 RPC 形式的通訊,這通常會圍繞對象方法的顯式調用而構建緊密耦合的系統。

相反,基於瀏覽器的 Web 應用程式是鬆散耦合的,具有很強的互通性。它們使用 HTTP 進行通訊,交換許許多多不同格式的 MIME 類型資料。Web 服務使傳統的 Web 編程模型適用於各種應用程式,而不僅僅是基於瀏覽器的應用程式。它們使用 HTTP 和其他 網際網路通訊協定 (IP)交換 SOAP 訊息。由於 Web 服務依賴於 HTTP、XML、SOAP 和 WSDL 等行業標準,在 Internet 上展示應用程式的功能,因此它們獨立於程式設計語言、平台和裝置。

ASP.NET Web 服務基礎結構通過將 SOAP 訊息映射到方法調用,為 Web 服務提供了簡單的 API。通過提供一種非常簡單的編程模型(基於將 SOAP 訊息交換映射到方法調用),它實現了此機制。ASP.NET Web 服務的用戶端不需要瞭解用於建立它們的平台、物件模型或程式設計語言。而服務也不需要瞭解向它們發送訊息的用戶端。唯一的要求是:雙方都要認可正在建立和使用的 SOAP 訊息的格式,該格式是由使用 WSDL 和 XML 結構描述 (XSD) 表示的 Web 服務合約定義來定義的。

.NET Remoting 為分布式對象提供了一個基礎結構。它使用既靈活又可擴充的管線向遠程進程提供 .NET 的完全對象語義。ASP.NET Web 服務基於訊息傳遞提供非常簡單的編程模型,而 .NET Remoting 提供較為複雜的功能,包括支援通過值或引用傳遞對象、回調,以及多個物件啟用和生命週期管理原則等。要使用 .NET Remoting,用戶端需要瞭解所有這些詳細資料,簡而言之,需要使用 .NET 建立用戶端。(或者使用支援 .NET Remoting 的其他架構,我們所知道的唯一一個架構是 Intrinsyc 的用於 Java 的 Ja.NET。).NET Remoting 管線還支援 SOAP 訊息,但必須注意這並沒有改變其對用戶端的要求。如果 Remoting 端點提供 .NET 專用的對象語義,不管是否通過 SOAP,用戶端必須理解它們。

.NET Framework 支援兩個截然不同的分布式編程模型 - Web 服務和分布式對象,這給開發人員造成了極大的混亂。系統何時應該使用 ASP.NET Web 服務,何時應該使用 .NET Remoting 呢?要回答這個問題,必須瞭解這兩種技術的工作原理。

序列化和中繼資料

所有分布式通訊管線最終都完成兩項工作:將程式資料類型的執行個體封送到可以通過網路傳送的訊息中,並提供對那些訊息的描述。前者是使用某種形式的序列化引擎(或稱為封送拆收器)完成的,後者是通過某種形式的中繼資料完成的。例如,對於大多數(現代的)DCOM 介面來說,序列化引擎是類型庫封送拆收器,而類型庫提供中繼資料。ASP.NET Web 服務和 .NET Remoting 之間的主要不同在於它們如何將資料序列化為訊息,以及它們為中繼資料選擇的格式。

ASP.NET Web 服務、XmlSerializer 和 XSD

ASP.NET Web 服務依賴於 System.Xml.Serialization.XmlSerializer 類,在運行時將資料封送到 SOAP 訊息中以及從 SOAP 訊息中封送資料。對於中繼資料,它們產生 WSDL 和 XSD 定義,說明訊息中包含什麼樣的內容。完全依賴於 WSDL 和 XSD 使 ASP.NET Web 服務中繼資料具有可移植性;它表示資料結構的方法,對於不同平台上使用不同編程模型的其他 Web 服務工具包也可以理解。在某些情況下,這限制了可以從 Web 服務中提供的類型 - XmlSerializer 只能封送可以用 XSD 表示的資料。也就是說,XmlSerializer 將不能封送對象圖形,而且對於容器類型的支援也很有限。

儘管這些限制從傳統的分布式對象的角度來看似乎很重要,但它們有助於確保與其他 Web 服務架構的互通性 - 這是鬆散耦合的 Web 服務模型的基本目標。大量自訂屬性使您能夠注釋資料類型,以控制 XmlSerializer 封送它們的方法,從而增強了對互通性的支援。因此,您可以細緻地控制在對象進行序列化時產生的 XML 的形狀。另外,還可以對基於 ASP.NET 的 Web 服務進行調整,以便用文字 XSD 或 SOAP 編碼規則(即 SOAP Section 5)描述訊息。文字 XSD 是預設的,而且將成為以後的標準。它還包括 SOAP 編碼支援,以便與現有的工具包進行互操作。這對使用者很有協助,特別是當使用者需要與現有 Web 服務或用戶端(它們需要使用預定義的訊息格式進行通訊)進行通訊時更是如此。

.NET Remoting、IFormatter 和公用語言運行庫

.NET Remoting 依賴於 System.Runtime.Serialization 引擎所使用的 IFormatter 介面的可插入實現程式向/從訊息中封送資料。有兩種標準的格式化程式:System.Runtime.Serialization.Formatters.Binary.BinaryFormatterSystem.Runtime.Serialization.Formatters.Soap.SoapFormatter。顧名思義,BinaryFormatterSoapFormatter 分別以二進位和 SOAP 格式封送類型。對於中繼資料,.NET Remoting 依賴於公用語言運行庫程式集,該程式集包含它們實現的資料類型的所有相關資訊,並通過反射提供它。對於中繼資料而言,依賴於程式集更容易保留全運行時類型的系統逼真度。因此,當 .NET Remoting 管線封送資料時,它包括類中所有公用和專有的成員,正確處理對象圖形並支援所有的容器類型(如 System.Collections.Hashtable)。但是,依賴運行時中繼資料也限制了 .NET Remoting 系統的使用範圍 - 用戶端必須理解 .NET 結構才能與 .NET Remoting 端點進行通訊。除了可插入的格式化程式外,.NET Remoting 層還支援可插入的通道,該通道去除了有關訊息發送方法的細節。有兩種標準的通道,一種用於原始的 TCP,一種用於 HTTP。訊息可以獨立于格式,通過任意一種通道進行發送。

各有利弊:Remoting 和 Web 服務

SOAP 格式化程式和 HTTP 通道的存在產生了這樣一個問題:可以使用 .NET Remoting 建立 Web 服務嗎?回答是肯定的也是否定的。標準的 Web 服務技術堆棧不僅依賴於基於 SOAP 的訊息,還依賴於訊息基於 WSDL 和 XSD 的描述。Remoting 管線能夠真正地產生描述端點所產生並使用的訊息的 WSDL 定義。但是,如果沿著這條思路走下去,會產生幾個問題。

首先,產生的 WSDL 檔案總是用 SOAP 編碼規則而不是文字 XSD 來描述訊息。雖然現在這不是問題,但隨著越來越多的工具完全著眼於架構,這種問題會越來越嚴重。

第二,產生的 WSDL 檔案包括 .NET Remoting 專用的擴充功能。例如,下面是使用 .NET Remoting 提供其行為的一個簡單的類。

public class Methods : MarshalByRefObject{// Now 方法返回當前的日期和時間public string Now(){return System.DateTime.Now.ToString();}}

如果從此類中產生 WSDL,綁定資訊將包括 .NET Remoting 專用的詳細資料,如下所示。

<binding name='MethodsBinding' type='ns0:MethodsPortType'><soap:binding style='rpc'transport='http://schemas.xmlsoap.org/soap/http'/><suds:class type='ns0:Methods' rootType='MarshalByRefObject'></suds:class><operation name='Now'><soap:operation soapAction='http://schemas.microsoft.com/clr/nsassem/RemSoap.Methods/methods#Now'/><suds:method attributes='public'/><input name='NowRequest'>...</input><output name='NowResponse'>...</output></operation></binding>

這些額外的元素是合法的,因為 WSDL 規範支援可擴充性。任何運作良好的 Web 服務工具包如果不理解它們都會簡單地忽略它們。但是,有些是 Web 服務工具包不能忽略的。例如,下面是一個返回 Microsoft ADO.NET System.Data.DataSet 的 Remoting 端點。

public class Methods : MarshalByRefObject{public System.Data.DataSet GetEmptyDataSet(){return new System.Data.DataSet();}}

下面是為此方法的輸出訊息產生的 WSDL 定義:

<message name='Methods.GetEmptyDataSetOutput'><part name='return' type='ns3:DataSet'/></message>

通常情況下,WSDL 訊息指的是使用 XML 結構描述在特定的命名空間中定義的類型。但在這種情況下,用於 DataSet 類型的命名空間的首碼 ns3 不是在 XSD 中定義的,而是通過運行時隱式定義的。本例中的首碼 ns3 應綁定到由以下 URI 確定的 XML 命名空間:

http://schemas.microsoft.com/clr/nsassem/System.Data/System.Data%2C%20Version%3D1.0.3300.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Db77a5c561934e089

此 WSDL 定義的用戶端是要瞭解這個“眾所周知”的 URI 的特殊意義 - 它是 .NET Framework 中包括的特定運行時程式集的嚴格名稱(由四部分組成)。這種 WSDL 對於使用 .NET Remoting 實現的用戶端非常有用,因為它們可以使用適於封送的資訊組建代理程式程式集。但是,對於不理解此 URI 並希望為 DataSet 類型找到架構定義的其他 Web 服務工具包(包括 ASP.NET),這種 WSDL 將毫無用處。

問題依然沒有解決:可以使用 .NET Remoting 建立 Web 服務嗎?嚴格地講,可以。但是,不使用 .NET Remoting 管線的人能使用它們嗎?回答是:也許可以,如果您小心地將端點減少到基礎資料型別 (Elementary Data Type)和語義。也就是說,如果您要與其他 Web 服務工具包進行互操作,則需要將參數限制到內建的簡單類型和您自己的資料類型(不能使用 DataSet 這樣的 .NET Framework 類型),而且要避免用戶端啟用的對象和事件。簡而言之,如果您關心使用範圍,則需要把自己限制到 ASP.NET Web 服務所支援的那些功能。

或者採取更好的方法,使用 ASP.NET Web 服務,因為這正是設計它們的目的所在。

分布式應用程式設計:ASP.NET Web 服務和 .NET Remoting

ASP.NET Web 服務支援 XML 結構描述類型系統,提供一種簡單的編程模型,使用範圍廣,可以跨平台使用。.NET Remoting 支援運行時類型的系統,提供較複雜的編程模型,使用範圍較窄。這種本質上的差別是決定使用哪種技術的主要因素。但是,還要考慮很多其他設計因素,包括傳輸協議、主機處理序、安全性、效能、狀態管理以及對事務的支援等。

傳輸協議和主機處理序

儘管 SOAP 規範並不要求用 HTTP 作為傳輸協議,但是用戶端只能通過 HTTP 訪問使用 ASP.NET Web 服務實現的 Web 服務,因為它是 ASP.NET 支援的唯一一種傳輸協議。服務是通過 IIS 調用的,並在 ASP.NET 的輔助進程 aspnet_wp.exe 中執行。

.NET Remoting 使您能夠在任何類型的應用程式(包括 Windows 表單、託管的 Windows 服務、控制台應用程式或 ASP.NET 輔助進程)中靈活地託管遠程對象。正如前面所述,.NET Remoting 提供兩個傳輸通道 - TCP 和 HTTP。這兩個通道都能使用通訊端提供任意發送和接收進程之間的通訊。

它還能將 HTTP 通道與 IIS 和 ASP.NET 輔助進程整合。這一點很重要,原因有以下幾點。首先,它是當用戶端請求到達時自動啟動 .NET Remoting 端點的唯一方法。.NET Remoting 管線不包括啟動遠程伺服器所需的 DCOM 類別型的服務控制管理員 (SCM)。如果從任意進程中提供遠程對象,則需要確保那些進程正在運行。還要確保它們是安全執行緒的,例如,在啟動線程 B 以關閉進程後,線程 A 不能啟用物件。如果從 ASP.NET 提供遠程對象,則可以利用 Aspnet_wp.exe 輔助進程,這樣既可自動啟動又具有安全執行緒的優勢。第二,與 IIS 整合是確保跨進程 .NET Remoting 調用的唯一途徑,如下一節所述。

ASP.NET Web 服務和 .NET Remoting 基礎結構都是可擴充的。您可以過濾入站和出站訊息,從多方面控制類型封送和中繼資料的產生。使用 .NET Remoting,還能實現您自己的格式化程式和通道。

安全性

由於 ASP.NET Web 服務依賴於 HTTP,因此它們與標準的 Internet 安全性基礎結構相整合。ASP.NET 利用 IIS 的安全性功能,為標準 HTTP 驗證方案(包括基本、簡要、數位憑證,甚至 Microsoft .NET Passport)提供了強有力的支援。(還可以使用 Windows 整合驗證,但只能用於信任域中的用戶端。)使用可用的 HTTP 驗證方案的一個優勢在於,無需在 Web 服務中更改代碼,IIS 是在 ASP.NET Web 服務被調用之前執行驗證的。ASP.NET 還支援基於 .NET Passport 的驗證和其他自訂的驗證方案。ASP.NET 支援基於目標 URL 的存取控制,並通過與 .NET 程式碼存取安全性 (CAS) 基礎結構的整合支援存取控制。SSL 可用於確保通訊的安全。

儘管這些標準傳輸技術對於確保 Web 服務相當有效,但它們只能做到這種程度。在涉及到不同信任域中多個 Web 服務的複雜情況下,還得建立自訂的特殊解決方案。Microsoft 和其他公司正致力於建立一套安全性規範,該規範將基於 SOAP 訊息的可擴充性提供訊息層級的安全性功能。這些規範之一是 XML Web 服務安全性語言(WS-Security [英文]),它為訊息層級的憑據傳輸、訊息完整性和訊息保密定義了架構。

正如上一節所述,一般情況下,.NET Remoting 管線不能確保跨進程調用的安全。使用 ASP.NET 託管於 IIS 中的 .NET Remoting 端點可以利用 ASP.NET Web 服務可用的所有安全性功能,包括對使用 SSL 確保有線通訊的安全性的支援。如果您正在使用託管在進程中的 TCP 通道或 HTTP 通道(而不是 aspnet_wp.exe),則必須自己執行身分識別驗證、授權和保密機制。

另一個要關注的安全性問題是,在不必更改預設安全性策略的情況下,從不完全信任環境中執行代碼的能力。ASP.NET Web 服務用戶端代理可以在這些環境中工作,但 .NET Remoting 代理則不能。要從不完全信任環境中使用 .NET Remoting 代理,需要特殊的序列化許可權。預設情況下,該許可權不會授予從 Intranet 或 Internet 上下載的代碼。如果要在不完全信任環境中使用 .NET Remoting 用戶端,則需要更改從那些地區中載入的代碼的預設安全性策略。當您從運行於沙箱(如下載的 Windows 表單應用程式)中的用戶端串連到系統時,ASP.NET Web 服務是較簡單的選擇,因為不需要更改安全性策略。

狀態管理

預設情況下,ASP.NET Web 服務模型採用無狀態的服務體繫結構;它並不是本能地與來自同一個使用者的多個調用相關。另外,用戶端每次調用 ASP.NET Web 服務時,都建立一個新的對象以服務於該請求。方法調用完成後,該對象即被破壞。要保持請求間的狀態,可以使用 ASP.NET 頁面所使用的技術(即會話和應用程式屬性包),也可以執行自訂的解決方案。

.NET Remoting 支援許多狀態管理選項,並且可能與來自同一個使用者的多個調用相關或不相關,這取決於您選擇的對象生命週期架構。SingleCall 對象是無狀態的(如用於調用 ASP.NET Web 服務的對象),Singleton 對象共用所有用戶端的狀態,用戶端啟用的對象在每個用戶端的基礎上保持狀態(帶有其產生的所有相關的可升級性和可靠性問題)。

效能

從原始效能方面來講,使用 TCP 通道和二進位格式化程式時,.NET Remoting 管線能夠提供最快的通訊。在我們進行的比較 ASP.NET Web 服務和 .NET Remoting 的相對效能的幾乎所有的測試中,ASP.NET Web 服務在效能上都超出了使用 HTTP 或 TCP 通道的 SOAP 格式化程式的 .NET Remoting 端點。更有意思的是,使用二進位格式化程式和 HTTP 通道的 ASP.NET 和 .NET Remoting 端點在效能上非常相近。有關詳細資料,請參閱效能比較:.NET Remoting 與 ASP.NET Web 服務。

企業服務

ASP.NET Web 服務或通過 .NET Remoting 提供的對象可以使用本地事務根據單個資料庫協調工作。如果需要根據多個資源協調工作,它可以使用 .NET 企業服務(也稱為 COM+)公布的事務(由 COM+ 管線管理的 DTC 分散式交易)。但要注意的是,ASP.NET Web 服務和 .NET Remoting 管線都不能傳播公布的事務,因此兩種端點都不可能通過跨進程的調用繼承公布的事務。

這不一定是件壞事。一般來講,公布的事務比本地事務代價要高,而要跨進程傳播公布的事務,則代價會更高。如果您確實需要這種功能,簡單的解決方案是在 .NET 企業服務伺服器應用程式中展開一個從 System.EnterpriseServices.ServicedComponent 中衍生的類(有關詳細資料,請參閱 COM+ Integration: How .NET Enterprise Services Can Help You Build Distributed Applications [英文])。對該類對象的跨進程調用將使用 DCOM 進行處理,以確保正確傳播事務環境。較難的解決方案是使用底層的 API,手動傳播分布的事務。

值得注意的是,傳統的分散式交易模型一般不適用於鬆散耦合的 Web 服務。基於補償事務的模型(即,撤消其他事務所提交工作的事務)更有意義,因為其隔離約束條件並不是很嚴格。在包括 Microsoft 的 Web 服務供應商中有一種普遍的說法,即 Web 服務空間需要的事務模型越靈活,該空間中進行的工作越多。等到定義出 Web 服務事務的標準方法時,您就可以根據情況使用本地或公布的事務實現自己的補償架構了。

選擇體繫結構

如果您正在設計一個基於 .NET 的分布式應用程式,則需要考慮本文中討論的所有問題,並對系統體繫結構的應有結果得出一些結論。一般來講,這比您想像的要容易些。但總有一些特殊的情況需要其他的方法,以下是您可以進行的某些一般假設,可為您簡化情況。

首先,在預設情況下使用 ASP.NET Web 服務。它們的執行和使用都很簡單,可以為用戶端平台提供儘可能寬的使用範圍,而且可以從預設安全性策略下沙箱中啟動並執行代碼中調用 ASP.NET Web 服務用戶端代理代碼。

如果要使用較傳統的帶有 CLR 類型逼真度的分布式物件模型,不需要與其他平台進行互操作,而且由您控制用戶端和伺服器的配置,請考慮使用 .NET Remoting。如果您選擇 .NET Remoting,最好使 HTTP 通道與 IIS 和 ASP.NET 整合,否則,必須建立自己的進程生命週期管理和安全性基礎結構。假定 .NET Remoting 需要 .NET 用戶端,使用二進位格式化程式而不是 SOAP 格式化程式是很有意義的;互通性將不成問題,而且效能將顯著提高。

最後,如果需要公布的事務,請使用企業服務 (COM+)。如果您執行 ServicedComponents,則出於效能方面的考慮,預設情況下它們將部署在庫應用程式中。如果它們需要在遠端電腦上運行,則將它們部署在伺服器應用程式中。(如果您需要執行不同的進程安全性令牌 [而不是 aspnet_wp.exe 使用的令牌] 的代碼,即使在相同的電腦上,可能也要考慮使用 COM+ 伺服器應用程式。)

以下是三個基於這些理念的公用體繫結構。

圖 1:簡單的 3 層體繫結構

圖 1 顯示了一個簡單的 3 層體繫結構,它帶有 Web 服務器領域,支援一系列不同的用戶端。所有伺服器端的代碼都在 ASP.NET 輔助進程 aspnet_wp.exe 中執行。這三種不同類型的用戶端可以使用 HTTP 訪問伺服器領域。基於瀏覽器的用戶端調用 ASP.NET Web 頁面;多用戶端(如 Windows 表單應用程式、Microsoft Visual Basic 6 應用程式)和其他 Web 服務使用 ASP.NET Web 服務;根據需要,.NET 多用戶端(如 Windows 表單應用程式)和 Web 服務使用 ASP.NET Web 服務,或使用 HTTP 通道和二進位格式化程式的 .NET Remoting(假定它不在沙箱中)。

圖 2:使用 ASP.NET 的 n 層體繫結構

一些非常大的應用程式使用一套輔助電腦從 Web 服務器的外層分擔工作。這種體繫結構 2 所示。請注意,在這種情況下,第二層也通過 ASP.NET 提供功能。

圖 3:使用企業服務 (COM+) 的 n 層體繫結構

圖 3 顯示此體繫結構的另一種版本,其第二層使用在 COM+ 中部署的 ServicedComponents 提供功能。

顯然,這些並不是 .NET Framework 所支援的所有可能的體繫結構。但是,它為您設計自己的系統提供了適當的基礎。

小結

雖然 .NET Remoting 基礎結構和 ASP.NET Web 服務都可以進行跨進程通訊,但每種設計適用於不同的使用者。ASP.NET Web 服務的編程模型很簡單,使用範圍很廣。.NET Remoting 的編程模型較複雜,使用範圍較窄。請務必瞭解這兩種技術的工作原理,並選擇適合您應用程式的技術。在任意一種情況下,都要使用 IIS 和 ASP.NET 管理進程生命週期,並提供一般的安全性。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.