services|web|xml|复选框|微软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 访问服务器应用程序。