摘要: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 是 SOAP V1.1 所支持的最常见的 XML Web Services 模型。它允许与其他运行 SOAP V1.1 兼容堆栈的计算机协同工作。服务器和客户端可以是运行 Apache SOAP 的非 Windows 服务器和运行 pocketSOAP 的 Pocket PC,也可以是基于 Windows 的服务器和客户端。唯一的要求是服务器上必须安装了与 WSDL 1.1 版本兼容的描述功能,以便生成相应的代理。此代理是在运行时生成的,并且第一次使用 WSDL 名字对象时没有用户介入。
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 服务适用于以下用户:
除了对 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 + Value2 End 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) & " " & Time next
如果用您的服务器名称替换上面脚本中的 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) & " " & Time next
要简化在服务器上发布 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) & " " & Time next
作为 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) & " " & Time next
为简单起见,上述示例全部使用 VBScript 来访问 Web 服务。其实也可以通过 SOAP WSDL 名字对象使用 Visual C+、Visual Basic 6.0、Visual Basic .NET 或 C# 进行编写。例如,Visual Basic .NET 也可以使用编译的托管代码访问同一对象,如下例所示:
Imports System Imports System.Runtime.InteropServices Module 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 Sub End Module
使用 VBScript 是为了表明,托管的和非托管的客户端都可以访问发布为 COM+ Web 服务的 COM+ 组件。在大型组织或应用程序中,很难一次转换所有部分,COM+ Web 服务允许将一部分应用程序转换为托管代码,而无需立即全面重新编写现有的应用程序。
服务器上的 COM+ Web 服务发布将每一组件发布为 WKO 和 CAO 两种形式,因此不需要额外的服务器配置。在服务器上唯一要做的操作是,在选择 Uses SOAP 复选框(位于 COM+ 应用程序属性页的 Activation 选项卡上)并在 SOAP VRoot 文本框中输入值以后,将 COM+ 应用程序作为代理程序导出。下面显示了导出代理应用程序的必要步骤:
图 2:组件服务管理工具
图 3: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) & " " & Time next
如果代理程序没有启用 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") next next
·DCOM实现分布式应用 | |
Copyright © 2002-2015 版权所有 学校地址:北京市海淀区西三旗建材城中路29号北大青鸟 招生热线:010-82011433/32 京公网安备110102004704 京ICP备05043413号 京公网安备110102004704 |