AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > SQL Server

COM+ Web 服务:通过复选框路由到 XML Web Services

51自学网 http://www.wanshiok.com

摘要: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 .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 .NET
SOAP 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 .NET
C# 或 VB .NETC# 或 VB .NET

这种新的 COM+ Web 服务适用于以下用户:

  1. 当前安装有 Microsoft® Visual Basic® 6.0 或者非托管 Microsoft Visual C++® COM+ 应用程序(需要通过防火墙才能进行某些激活操作)的 COM+ 用户。(使用 SOAP 并不排斥通过 DCOM 访问服务器上的相同组件,客户端计算机可以选择协议。)对于这些客户来说,如果要使用 SOAP 而不是 DCOM,则使用客户端代理导出和 CAO 模型都不需要更改客户端和服务器应用程序。只需要在服务器应用程序上启用 SOAP,将其作为客户端代理导出,然后将代理安装在要用作 SOAP 客户端的 Windows XP 计算机上。
  2. 完全迁移到 Windows XP 和 Windows .NET Server 上的托管代码的公司。COM+ Web 服务有助于在连接的两端设置远程端点。
  3. 需要在上述两种方案中组合和匹配各种服务的开发人员,以及编写托管服务器组件、或带有非托管服务器组件的托管客户端应用程序的开发人员。在第二种情况中,开发人员可以利用 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 ExecutionRetained 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+ 应用程序作为代理程序导出。下面显示了导出代理应用程序的必要步骤:

  1. 用鼠标右键单击组件服务管理工具中的 VB6Soap COM+ 应用程序,并选择 Export,如图 2 所示。

     

    图 2:组件服务管理工具

  2. 在图 3 所示的 COM+ 应用程序导出向导中,输入代理 .msi 文件的位置和名称。

     

    图 3:COM+ 应用程序导出向导

  3. 将代理 .msi 文件安装在单独的客户端计算机上,作为预先生成的 COM+ 应用程序。

    安装时将对代理进行适当的配置,以便通过 SOAP 访问正确的服务器和虚拟根。对于客户端激活,可以不使用 WSDL 名字对象,而使用常规非托管的 COM+ 激活(例如,CoCreateInstanceCreateObject 等)。在服务器上创建并在单独的客户端计算机上安装上述 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

<

 

 

 
上一篇:DCOM实现分布式应用  下一篇:P2P技术与应用