摘要: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 .NET | SOAP V1.1(在 WSDL 中描述) | C# 或 VB .NET | VB 6.0 或非托管 C++ | C# 或 VB .NET | VB .NET 或 C# | C# 或 VB .NET | Microsoft SOAP(ATL Server,SOAP TK) | Microsoft SOAP Toolkit V2.0 | VB 6.0 或非托管 C++ | Microsoft SOAP Toolkit V2.0 | C# 或 VB .NET | SOAP v1.1 | VB 6.0 或非托管 C++ | SOAP v1.1 | C# 或 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 .NET | C# 或 VB .NET | 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 访问服务器应用程序。
事务性组件示例简单的计算器远算不上工作量繁重的业务应用程序,因此我们现在考虑带有对象池的适于 COM+ 事务性组件的应用程序。 最容易管理和配置的组件是由 ServicedComponent 导出的托管代码组件,如以下 C# 示例所示: using System;using System.Reflection;using System.Runtime.InteropServices;using System.EnterpriseServices;using System.Data;using System.Data.SqlClient;[assembly: ApplicationName("SCTrans")][assembly: ApplicationActivation(ActivationOption.Server, SoapVRoot="SCTrans")][assembly: AssemblyKeyFile("SCTrans.snk")]namespace SCTrans{ public interface ISCTrans { string CountUp (string Key); } [ObjectPooling(MinPoolSize=0, MaxPoolSize=25)] [JustInTimeActivation(true)] [ClassInterface(ClassInterfaceType.AutoDual)] [TransactionAttribute(TransactionOption.RequiresNew)] public class SCTransSQLNC : ServicedComponent, ISCTrans { [AutoComplete] public string CountUp (string Key) { _command = new SqlCommand("", _connection); _command.CommandType = CommandType.Text; _command.Connection.Open(); _command.CommandText = "UPDATE CallCount WITH (ROWLOCK) SET CallCount = CallCount + 1 WHERE Machine='" + Key + "'"; _command.ExecuteNonQuery(); _command.Connection.Close(); _numcalls++; return (_numcalls + " NC " + _guid); } protected override bool CanBePooled() { return true; } private int _numcalls = 0; private string _guid = Guid.NewGuid().ToString(); private SqlConnection _connection = new SqlConnection("user id=MyUser;password=My!Password; database=SoapTest;server=MyServer"); private SqlCommand _command; }} 要建立并运行此 C# 组件,在完成编辑连接值以连接到 Microsoft SQL Server™ 数据库之后,需要使用 sn.exe 生成 sctrans.snk 加强名称关键字文件,然后在 using 语句中使用程序集引用对其进行编译。如果您在服务器上进行部署,应使用 gacutil.exe(如果正在使用 SDK)或通过 .NET 框架用户界面将程序集放入 GAC,然后运行 regsvcs.exe,注册 COM+ 托管组件。Regsvcs.exe 将使用以下属性,将组件发布为服务器上的 SOAP 端点和服务器(进程外)激活: [assembly: ApplicationActivation(ActivationOption.Server, SoapVRoot="CSSoapSQL")] 此组件在每种方法调用中使用不同的事务,具有一个自动完成方法,并被配置为进行缓冲。使用托管和非托管 COM+ 组件时,对象池和事务将如所预期的那样通过 SOAP 运行。例如,如果使用下列 VBScript 通过 SOAP 访问以下 ServicedComponent: mon = "soap:wsdl=http://jnoss3/sctrans/SCTrans.SCTransSQLNC.soap?WSDL"WScript.Echo(mon)for i = 1 to 2 set c = GetObject(mon) for j = 1 to 10 WScript.Echo i & " " & j & " " & c.CountUp("SCWKONC") nextnext <  
1/2 1 2 下一页 尾页 |