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 访问服务器应用程序。