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 發布)的部署。 目錄
- 簡介
- 簡單的已知對象 (wko) 示例
- 簡單的客戶端激活對象 (cao) 示例
- 事務性組件示例
- 一切才剛剛開始
簡介
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 .netsoap v1.1vb 6.0 或非托管 c++soap v1.1c# 或 vb .net
表 2:cao 模型支持的方案cao 客戶端cao 服務器c# 或 vb .net(早期綁定)vb 6.0 或非托管 c++vb 6.0 或非托管 c++vb 6.0 或非托管 c++vb 6.0 或非托管 c++c# 或 vb .netc# 或 vb .net[td]c# 或 vb .net
這種新的 com+ web 服務適用于以下用戶: - 當前安裝有 microsoft® visual basic® 6.0 或者非托管 microsoft visual c++® com+ 應用程序(需要通過防火墻才能進行某些激活操作)的 com+ 用戶。(使用 soap 并不排斥通過 dcom 訪問服務器上的相同組件,客戶端計算機可以選擇協議。)對于這些客戶來說,如果要使用 soap 而不是 dcom,則使用客戶端代理導出和 cao 模型都不需要更改客戶端和服務器應用程序。只需要在服務器應用程序上啟用 soap,將其作為客戶端代理導出,然后將代理安裝在要用作 soap 客戶端的 windows xp 計算機上。
- 完全遷移到 windows xp 和 windows .net server 上的托管代碼的公司。com+ web 服務有助于在連接的兩端設置遠程端點。
- 需要在上述兩種方案中組合和匹配各種服務的開發人員,以及編寫托管服務器組件、或帶有非托管服務器組件的托管客戶端應用程序的開發人員。在第二種情況中,開發人員可以利用 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 execution 和 retained 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+ 應用程序作為代理程序導出。下面顯示了導出代理應用程序的必要步驟: - 用鼠標右鍵單擊組件服務管理工具中的 vb6soap com+ 應用程序,并選擇 export,如圖 2 所示。
圖 2:組件服務管理工具 - 在圖 3 所示的 com+ 應用程序導出向導中,輸入代理 .msi 文件的位置和名稱。
圖 3:com+ 應用程序導出向導 - 將代理 .msi 文件安裝在單獨的客戶端計算機上,作為預先生成的 com+ 應用程序。
安裝時將對代理進行適當的配置,以便通過 soap 訪問正確的服務器和虛擬根。對于客戶端激活,可以不使用 wsdl 名字對象,而使用常規非托管的 com+ 激活(例如,cocreateinstance、createobject 等)。在服務器上創建并在單獨的客戶端計算機上安裝上述 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 訪問服務器應用程序。