COM+ Web 服務:通過復選框路由到 XML Web Services(1) (微軟中國)

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- COM+ Web 服務:通過復選框路由到 XML Web Services(1) (微軟中國) (http://www.webasp.net/article/5/4913.htm)
-- 作者:未知
-- 發佈日期: 2003-07-12
COM+ Web 服務:通過復選框路由到 XML Web Services
John Noss 和 Jonathan Hawkins
Microsoft Corporation
2001年11月

摘要:COM+ Web 服務新增了某些功能,可與 Microsoft .NET Remoting 集成,並通過 SOAP for COM+ 組件實現 XML Web Services 發佈的復選框激活。本文通過幾個示例介紹基本的互操作性、配置以及托管和非托管 COM+ 組件(在 Microsoft Windows .NET Server 和 Microsoft Windows XP Professional 上作為 XML Web Services 發佈)的部署。

目錄

簡介


COM+ Web 服務新增了某些功能,可與 Microsoft .NET Remoting 集成,並通過 SOAP for COM+ 組件實現 XML Web Services 發佈的復選框激活。本文通過幾個示例介紹基本的互操作性、配置以及托管和非托管 COM+ 組件(在 Microsoft Windows .NET Server 和 Microsoft® Windows® XP Professional 上作為 XML Web Services 發佈)的部署。還通過示例介紹了幾個新功能,使運行 Windows XP 的客戶端能夠訪問遠程服務器上的 XML Web Services。
當開發人員使用 .NET Remoting 和托管代碼來完善現有的非托管 COM+ 服務器和客戶端代碼時,這些功能可以幫助他們利用和簡化遷移過程。在 .NET 框架的測試階段,有許多用戶問及如何配置 .NET Remoting 來進行簡單的跨計算機激活操作。COM+ Web 服務的解決方案是同時自動配置服務器 (Microsoft Windows .NET Server) 和客戶端 (Microsoft Windows XP Professional) 計算機,使用 .NET Remoting 來提供 SOAP 以替代 DCOM。
Microsoft Windows XP 和 Microsoft .NET 框架是本年度發佈的兩個最重要的軟件。二者的目的都是為了簡化過程並提高軟件開發人員的能力,因此利用這兩種產品並發揮各自優勢來提供一套集成的、易於使用的解決方案就成為自然之選。COM+ Web 服務提供了一種簡單的方法,可以將 COM+ 組件發佈為 XML Web Services ;還提供了新的集成功能,用於從客戶端計算機訪問 XML Web Services。從以下 Microsoft Visual Basic Scripting Edition (VBScript) 示例中可以瞭解其易於使用的特點,該示例用於確定 Alaska 的 Fairbanks 的當前氣溫。請在 Windows XP(已安裝 .NET 框架)或 Windows .NET Server 上運行此示例:
set SoapObj = GetObject   ("soap:wsdl=http://www.xmethods.net/sd/TemperatureService.wsdl")WScript.Echo "Fairbanks 氣溫 = " & SoapObj.getTemp("99707")

在上面的示例中,服務器是在 Linux 上運行的 Apache SOAP Server,但也可以使用任何具有標準 Web 服務說明語言 (WSDL) 描述功能的 SOAP V1.1 服務器。
注意: 如果出現「未找到服務器」錯誤,您需要在控制面板的 Internet 選項中手動配置防火牆設置。

使用 SOAP 作為計算機之間通信協議的優點之一,在於它增加了可以交互操作的計算機的種類。.NET Remoting 具有以下兩種基本操作模型:
  • 已知對像 (WKO): WKO 是 SOAP V1.1 所支持的最常見的 XML Web Services 模型。它允許與其他運行 SOAP V1.1 兼容堆棧的計算機協同工作。服務器和客戶端可以是運行 Apache SOAP 的非 Windows 服務器和運行 pocketSOAP 的 Pocket PC,也可以是基於 Windows 的服務器和客戶端。唯一的要求是服務器上必須安裝了與 WSDL 1.1 版本兼容的描述功能,以便生成相應的代理。此代理是在運行時生成的,並且第一次使用 WSDL 名字對像時沒有用戶介入。
  • 客戶端激活的對象 (CAO): CAO 提供了更豐富的開發環境,包括穩定持久的連接。較之典型的 XML Web Services 模型,它更類似於 DCOM 模型,但要求在服務器和客戶端上都安裝有某一版本的 .NET 框架。

COM+ Web 服務可以使用 WKO 和 CAO 兩種激活模型,而且所有的服務器應用程序都可以提供 WKO 和 CAO 端點。通過組合使用激活模型、XML Web Services 和 .NET Remoting,開發人員可以輕鬆地組合和匹配托管及非托管的客戶端和服務器。下表所示為兩種激活模型所支持方案的示例。
表 1:WKO 模型支持的方案WKO 客戶端WKO 服務器
VB 6.0 或非托管 C++VB 6.0 或非托管 C++
VB 6.0 或非托管 C++VB .NET 或 C#
VB 6.0 或非托管 C++SOAP V1.1(在 WSDL 中描述)
VB 6.0 或非托管 C++Microsoft SOAP(ATL Server,SOAP TK)
C# 或 VB .NETSOAP V1.1(在 WSDL 中描述)
C# 或 VB .NETVB 6.0 或非托管 C++
C# 或 VB .NETVB .NET 或 C#
C# 或 VB .NETMicrosoft SOAP(ATL Server,SOAP TK)
Microsoft SOAP Toolkit V2.0VB 6.0 或非托管 C++
Microsoft SOAP Toolkit V2.0C# 或 VB .NET
SOAP v1.1VB 6.0 或非托管 C++
SOAP v1.1C# 或 VB .NET

表 2:CAO 模型支持的方案CAO 客戶端CAO 服務器[TD]C# 或 VB .NET
C# 或 VB .NET(早期綁定)VB 6.0 或非托管 C++
VB 6.0 或非托管 C++VB 6.0 或非托管 C++
VB 6.0 或非托管 C++C# 或 VB .NET
C# 或 VB .NET

這種新的 COM+ Web 服務適用於以下用戶:
  1. 當前安裝有 Microsoft® Visual Basic® 6.0 或者非托管 Microsoft Visual C++® COM+ 應用程序(需要通過防火牆才能進行某些激活操作)的 COM+ 用戶。(使用 SOAP 並不排斥通過 DCOM 訪問服務器上的相同組件,客戶端計算機可以選擇協議。)對於這些客戶來說,如果要使用 SOAP 而不是 DCOM,則使用客戶端代理導出和 CAO 模型都不需要更改客戶端和服務器應用程序。只需要在服務器應用程序上啟用 SOAP,將其作為客戶端代理導出,然後將代理安裝在要用作 SOAP 客戶端的 Windows XP 計算機上。
  2. 完全遷移到 Windows XP 和 Windows .NET Server 上的托管代碼的公司。COM+ Web 服務有助於在連接的兩端設置遠程端點。
  3. 需要在上述兩種方案中組合和匹配各種服務的開發人員,以及編寫托管服務器組件、或帶有非托管服務器組件的托管客戶端應用程序的開發人員。在第二種情況中,開發人員可以利用 COM+ Web 服務,在用托管代碼替換之前充分利用早期的非托管組件。

簡單的已知對像 (WKO) 示例


除了對 Linux 和 ApacheIn 提供 SOAP 支持外,將 COM+ Web 服務應用於其他 Microsoft 產品(例如 ATL Server Web 服務)也非常簡單。只需使用 Microsoft Visual Studio® .NET 在服務器上生成、編譯和部署默認的 ATL Web 服務即可。對它進行訪問的客戶端代碼如下(請用駐留 ATL Server 應用程序的 Web 服務器名稱替換 MyServer,用您的 ATL Server DLL 的名稱替換 JALTServer):
mon="soap:wsdl=http://MyServer/JALTServer/JALTServer.dll?   Handler=GenJALTServerWSDL"set c = GetObject(mon)WScript.Echo c.HelloWorld("COM+ Web 服務") 

上述示例簡單說明了 Microsoft Windows XP 和 Microsoft Windows .NET 服務器所包含的一個新的 SOAP 名字對象。

數據發佈


如果您只想提供數據而不是使用數據,那麼只需選擇一個復選框,然後輸入 IIS 虛擬根名稱的值。要創建完整的 COM+ Web 服務,請執行以下步驟:
使用 Visual Basic 6.0 創建簡單的 Microsoft ActiveX® DLL,並輸入以下代碼:
Function Add(ByVal Value1 As Double, ByVal Value2 As Double) As Double Add = Value1 + Value2End Function

在 Visual Basic 項目屬性頁上的 General選項卡中,設置 Unattended ExecutionRetained in Memory,並在 Component 選項卡中選擇 Remote Server Files。使用 Visual Basic 開發環境生成此 DLL。
在創建 Visual Basic 應用程序之後,需要將其註冊為 COM+ 應用程序。啟動組件服務管理工具,在 Windows XP 上創建 COM+ 應用程序。(在此示例中,應用程序被命名為 VB6Soap。)將所創建的 DLL 作為組件導入,然後瀏覽到 COM+ 應用程序屬性頁的 Activation 選項卡,選擇 Uses SOAP,輸入一個 SOAP Vroot(例如,VB6Soap),然後單擊 OK(如圖 1 所示)。

圖 1:VB6Soap COM+ 應用程序屬性頁
現在,應用程序已發佈為 XML Web Services,並且可以使用 SOAP 激活。使用 Internet Explorer 瀏覽到 http://localhost/VB6Soap/default.aspx,您會在該 aspx 頁上發現一個超鏈接,通過它可以鏈接到您的組件所生成的 WSDL。以下 VBScript 將激活您的組件:
set c = GetObject   ("soap:wsdl=http://localhost/VB6Soap/VB6Soap.Calc.soap?WSDL")for i = 1 to 10 WScript.Echo i & " " & c.Add(i,i) & " " & Timenext 

如果用您的服務器名稱替換上面腳本中的 localhost,它也可以在遠程客戶端計算機上正常工作。引用的頁面(在此示例中為 VB6Soap.Calc.soap)是以 .soap 後綴結尾的組件 ProgID。
要通過 SOAP Toolkit(與 Windows XP Professional 一起提供,並且不使用 .NET Remoting)訪問同一端點,請運行以下 VBScript:
set c = CreateObject("MSSOAP.SOAPClient")c.mssoapinit("http://localhost/VB6Soap/VB6Soap.Calc.soap?WSDL")for i = 1 to 10 WScript.Echo i & " " & c.Add(i,i) & " " & Timenext 

要簡化在服務器上發佈 SOAP 的過程,您可以使用 Microsoft C#™ 或 Visual Basic .NET,並從 ServicedComponent 繼承。下面是簡單托管組件的托管代碼示例:
using System;using System.Reflection;using System.Runtime.InteropServices;using System.EnterpriseServices;[assembly: ApplicationName("CSSoap")][assembly: ApplicationActivation(ActivationOption.Server,    SoapVRoot="CSSoap")][assembly: AssemblyKeyFile("CSSoap.snk")]namespace CSSoap{  public interface ICalc  {   double Add (double Value1, double Value2);  }  [ClassInterface(ClassInterfaceType.AutoDual)]  [TransactionAttribute(TransactionOption.None)]  public class Calc : ServicedComponent, ICalc  {   public double Add (double Value1, double Value2);   {      return (Value1 + Value2);   }   }}

上述示例中值得注意的是 ApplicationActivation 屬性:
[assembly: ApplicationActivation(ActivationOption.Server,    SoapVRoot="CSSoap")]

建立 C# 組件,將它安裝在全局程序集緩存中,然後運行 regsvcs.exe 將它註冊為 COM+ 應用程序。這樣,該組件就被發佈為 IIS 虛擬根和 SOAP 端點。要成功地遠程使用 ServicedComponent,還需要使用 gacutil.exe 或 .NET 框架用戶界面,將這個編譯後的程序集放入全局程序集緩存 (GAC) 中。要通過 WSDL 訪問此 SOAP 端點,請使用以下 VBScript:
set c = GetObject   ("soap:wsdl=http://localhost/CSSoap/CSSoap.Calc.soap?WSDL")for i = 1 to 10 WScript.Echo i & " " & c.Add(i,i) & " " & Timenext 

作為 SOAP 交互操作性的簡單示例,SOAP Toolkit 與 Windows XP Professional 一起提供,並且即使運行 Windows XP 的客戶端計算機上沒有安裝 .NET 框架,使用以下 VBScript 也可以訪問 COM+ SOAP 端點:
set c = CreateObject("MSSOAP.SOAPClient")c.mssoapinit("http://localhost/CSSoap/CSSoap.Calc.soap?WSDL?for i = 1 to 10 WScript.Echo i & " " & c.Add(i,i) & " " & Timenext 

為簡單起見,上述示例全部使用 VBScript 來訪問 Web 服務。其實也可以通過 SOAP WSDL 名字對像使用 Visual C+、Visual Basic 6.0、Visual Basic .NET 或 C# 進行編寫。例如,Visual Basic .NET 也可以使用編譯的托管代碼訪問同一對象,如下例所示:
Imports SystemImports System.Runtime.InteropServicesModule WKOClient Sub Main()    Dim WSDLMoniker =       "soap:wsdl=http://localhost/CSSoap/CSSoap.Calc.soap?WSDL"      Dim obj as Object   obj = Marshal.BindToMoniker(WSDLMoniker)   Console.WriteLine(obj.Add(1,2)) End SubEnd Module

使用 VBScript 是為了表明,托管的和非托管的客戶端都可以訪問發佈為 COM+ Web 服務的 COM+ 組件。在大型組織或應用程序中,很難一次轉換所有部分,COM+ Web 服務允許將一部分應用程序轉換為托管代碼,而無需立即全面重新編寫現有的應用程序。

簡單的客戶端激活對像 (CAO) 示例


服務器上的 COM+ Web 服務發佈將每一組件發佈為 WKO 和 CAO 兩種形式,因此不需要額外的服務器配置。在服務器上唯一要做的操作是,在選擇 Uses SOAP 復選框(位於 COM+ 應用程序屬性頁的 Activation 選項卡上)並在 SOAP VRoot 文本框中輸入值以後,將 COM+ 應用程序作為代理程序導出。下面顯示了導出代理應用程序的必要步驟:
  1. 用鼠標右鍵單擊組件服務管理工具中的 VB6Soap COM+ 應用程序,並選擇 Export,如圖 2 所示。

    圖 2:組件服務管理工具
  2. 在圖 3 所示的 COM+ 應用程序導出嚮導中,輸入代理 .msi 文件的位置和名稱。

    圖 3:COM+ 應用程序導出嚮導
  3. 將代理 .msi 文件安裝在單獨的客戶端計算機上,作為預先生成的 COM+ 應用程序。
    安裝時將對代理進行適當的配置,以便通過 SOAP 訪問正確的服務器和虛擬根。對於客戶端激活,可以不使用 WSDL 名字對象,而使用常規非托管的 COM+ 激活(例如,CoCreateInstanceCreateObject 等)。在服務器上創建並在單獨的客戶端計算機上安裝上述 Visual Basic 計算器示例的應用程序代理後,以下 VBScript 將通過 SOAP 訪問該服務器:
    set c = CreateObject("VB6Soap.Calc")for i = 1 to 10 WScript.Echo i & " " & c.Add(i,i) & " " & Timenext 

    如果代理程序沒有啟用 COM+ Web 服務,則上述 VBScript 代碼將使用 DCOM 訪問服務器應用程序。

webasp.net