深蓝海域KMPRO

从SOAP Toolkit迁移到Web服务

2002-09-16 13:47

从SOAP Toolkit迁移到Web服务


升级到 Microsoft .NET

Peter Vogel

PH&V 信息服务

2002 1月

摘要:如何从 Visual Basic 6.0 和 Visual Basic .NET 访问 Web 服务,以及如何将现有的 SOAP 应用程序转换到 .NET 平台。

目标

了解 Microsoft? Visual Studio? .NET 中的 SOAP 工具

回顾使用 SOAP 和 Visual Basic? 6.0 访问 COM/COM+ 组件

从 Visual Basic .NET 访问 Web 服务

将 SOAP Toolkit 应用程序迁移到 Web 服务

前提条件

了解什么是 Web 服务

精通并且可以访问 Visual Basic 6.0 和 SOAP,且知道如何创建 ActiveX? DLL 项目

熟悉有关 Visual Studio .NET 的基础知识

Web 服务、SOAP 和您的工具

Web 服务提供了可以通过 Internet 访问的功能,即调用 Web 服务并获取返回的结果。Web 服务的新增功能是,您现在可以连接到世界最大网络 Internet 上的服务。不过,作为一名 Visual Basic 程序员,Web 服务为您处理了繁琐的 Internet 事务。

在本文中,您将了解如何使用 Visual Studio .NET 访问 Web 服务、回顾使用 Visual Basic 6.0 和 SOAP Toolkit 2.0 创建 Web 服务的过程,还将了解如何转换现有的 SOAP Toolkit 应用程序,以便在 .NET 框架中使用 Web 服务。

本文使用的 Web 服务有一个非常简单的函数 createCustomer。它接受客户的姓名,并返回客户标识符。但是,我们不在这里讨论 Web 服务的功能,以便您可以集中精力了解如何使用 Visual Basic 6.0 或 Visual Basic .NET 创建和访问 Web 服务。

Visual Basic 和 SOAP

用户通过发送和接收 SOAP 文档与 Web 服务通信。在 Visual Basic 6.0 中,有两种方法可以创建 SOAP 文档:

通过连接字符串组合文档

使用 SOAP Toolkit 2.0 中的 SoapClient

SoapClient 不仅创建一个 SOAP 文档与 Web 服务通信,还将该文档发送到 Web 服务进行处理。

在传输的 Web 服务端,需要一个 SOAP 侦听器捕获并处理客户端发送的文档。SOAP Toolkit 2.0 包括 SoapServer,可以在侦听应用程序中使用它处理 SOAP 文档。侦听器是单独创建的应用程序,它独立于实现 Web 服务的组件。

使用 Visual Studio .NET,可以简化对 Web 服务的创建和访问。在 Visual Studio .NET 中,创建 Web 服务并不要求构造单独的侦听应用程序。在访问 Web 服务时,它会自动为您创建代理,这样,您使用 Web 服务就像访问其他任何对象一样。

Web 服务描述工具

Web 服务描述语言 (WSDL) 是一种 XML 语言,它是专门为描述 Web 服务而设计的。作为使 Web 服务成为开放式标准的过程的一部分,WSDL 已连同 SOAP 一起提交到 W3C。对服务的 WSDL 描述可以包含 wsdlSpec tModel,它为服务提供创建和发送 SOAP 文档所需的全部信息。以下是支持 createCustomer 函数的 wsdlSpec tModel 文件的示例:

<?xml version='1.0' encoding='UTF-8' ?>
 <!-- Generated 06/25/01 by Microsoft SOAP Toolkit WSDL
      File Generator, Version 1.00.623.1 -->
<definitions  name ='cust'  
    targetNamespace = 'http://tempuri.org/wsdl/'
    xmlns:wsdlns='http://tempuri.org/wsdl/'
    xmlns:typens='http://tempuri.org/type'
    xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
    xmlns:xsd='http://www.w3.org/2001/XMLSchema'
    xmlns:stk=
'http://schemas.microsoft.com/soap-toolkit/wsdl-extension'
    xmlns='http://schemas.xmlsoap.org/wsdl/'>
  <types>
    <schema targetNamespace='http://tempuri.org/type'
      xmlns='http://www.w3.org/2001/XMLSchema'
      xmlns:SOAP-ENC=
         'http://schemas.xmlsoap.org/soap/encoding/'
      xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'
      elementFormDefault='qualified'>
    </schema>
  </types>
  <message name='Custservices.createCustomer'>
    <part name='First' type='xsd:string'/>
    <part name='Last' type='xsd:string'/>
  </message>
  <message name='Custservices.createCustomerResponse'>
    <part name='Result' type='xsd:string'/>
  </message>
  <portType name='CustservicesSoapPort'>
    <operation name='createCustomer'
      parameterOrder='First Last'>
      <input message=
         'wsdlns:Custservices.createCustomer' />
      <output
   message='wsdlns:Custservices.createCustomerResponse' />
    </operation>
  </portType>
  <binding name='CustservicesSoapBinding'
           type='wsdlns:CustservicesSoapPort' >
    <stk:binding preferredEncoding='UTF-8'/>
    <soap:binding style='rpc'
      transport='http://schemas.xmlsoap.org/soap/http' />
    <operation name='Add' >
      <soap:operation soapAction=
         'http://tempuri.org/action/Custservices.Add' />
      <input>
        <soap:body use='encoded'
         namespace='http://tempuri.org/message/'
         encodingStyle=
         'http://schemas.xmlsoap.org/soap/encoding/' />
      </input>
      <output>
        <soap:body use='encoded'
         namespace='http://tempuri.org/message/'
        encodingStyle=
         'http://schemas.xmlsoap.org/soap/encoding/' />
      </output>
    </operation>
  </binding>
  <service name='cust' >
    <port name='CustservicesSoapPort'
      binding='wsdlns:CustservicesSoapBinding' >
      <soap:address
      location='http://localhost/customer/cust.ASP' />
    </port>
  </service>
</definitions>

wsdlSpec tModel 末尾的 <service> 标记指定将请求发送到哪个 SOAP 侦听器,在本例中,将发送到 http://localhost/cust/cust.asp 页。此文件的前一部分说明服务可以使用的消息。

注意:SOAP 文档中使用的名称空间 tempuri.org 是一个临时名称空间,仅在开发时使用 (temporary uri)。在此服务投入到产品之前,应修改 WSDL 文件,使其拥有唯一的 URI(例如,您公司网站的 URL)。
SOAP Toolkit 对象和 Visual Studio .NET IDE 都读取 WSDL 文件。SoapClient 使用 WSDL 文件中的信息以使其作为 Web 服务的代理。Visual Studio .NET 使用同样的信息为 Web 服务生成代理类。因此,您可以执行以下操作:

调用 Web 服务的方法,好像它们是这些代理的方法。

发送消息前,根据 Web 服务的 WSDL 描述验证调用。

与代理交互,而不必熟悉 WSDL 文件的内容或要生成的 SOAP 文档。

图 1 显示了各个组件之间的关系,包括 Web 服务元语言 (WSML) 文件。只有 Visual Basic 6.0 需要此文件,并在其演练中描述此文件。

图 1:Web 服务和客户端示意图

在 SOAP 中,SOAP Toolkit 和 Visual Studio .NET IDE 执行类似的功能。所不同的是,SOAP Toolkit 对象不能提供 Visual Basic 开发人员所需的全部支持。在图 2 中,可以看到 IntelliSense? 支持(Visual Basic 程序员认为此类支持是必要的)。IntelliSense 下拉列表自动显示 Customerservices COM 对象的 createCustomer 方法。

图 2:COM/DCOM/COM+ 对象的 IntelliSense 支持

在图 3 中,您可以看到 SoapClient 为 Web 服务提供的 IntelliSense 支持。所有的 SoapClient 方法均列出,但没有显示将 SoapClient 作为代理的服务所拥有的方法(即 createCustomer)。

图 3:使用 SoapClient 的 IntelliSense 支持

如果使用 Visual Studio .NET,由 IDE 生成的代理类能够比 SOAPClient 更好地表示 Web 服务。在图 4 中,您可以看到用于访问 Web 服务的 IntelliSense 支持。createCustomer 方法是与 Web 服务交互的对象所拥有的方法之一。

图 4:Visual Studio .NET 中对 Web 服务的 IntelliSense 支持

SOAP Toolkit 2.0 概述

本节简单回顾了在上一节 Web 服务、SOAP 和您的工具中介绍的创建 Web 服务的过程。

使用 SOAP Toolkit 创建和访问 Web 服务

在 Visual Basic 6.0 中,为 Web 服务创建名为 CustCP 的新 Visual Basic ActiveX DLL 项目和名为 Customerservices 的类模块及其代码:

Public Function createCustomer(ByVal First As String, _
      ByVal Last As String) As String

createCustomer = "A" & CStr(Len(First)) & _
                        CStr(Len(Last))
End Function

使用 SOAP Toolkit 的 WSDL 向导生成 WSDL 和 WSML 文件(WSML 文件中包含 SOAPServer 用于从 Web 服务映射到 ActiveX COM 对象的信息)。

创建 SOAP 侦听器,作为使用 SOAPServer 的 ASP 页:

<%@ LANGUAGE=VBScript %>
<%Option Explicit
   
  Dim ss
  Dim WSDL
  Dim WSML
 
  Response.ContentType = "text/xml"
     
  WSDL = Server.MapPath("cust.wsdl")
  WSML = Server.MapPath("cust.wsml")
     
  Set ss = Server.CreateObject("MSSOAP.SoapServer")
  ss.Init WSDL, WSML
  ss.SOAPInvoke Request, Response, ""%> 

创建客户端以调用使用 SOAPClient 的 Web 服务:
Private Sub cmdCreate_Click()
Dim sc As MSSOAPLib.SoapClient

Set sc = New SoapClient
sc.mssoapinit "http://vogel2/cust/cust.wsdl"
Me.txtCustId.text = _
      sc.createCustomer(Me.txtFirstName.text, _
                     Me.txtLastName.text)
End Sub

Visual Basic .NET 演练

在本节中,您将了解如何完成以下操作:

在 Visual Studio .NET 中创建 Web 服务。

从 Visual Basic .NET 应用程序访问 Web 服务。

在 Visual Studio .NET 中生成 Web 服务时,将为该 Web 服务自动生成一个“发现文件”。发现文件用于向其他 Visual Studio .NET 应用程序添加 Web 服务引用,包括 WSDL 描述。

注意:对于 Visual Basic 和 C# 项目,发现文件的文件类型是 .vsdisco;对于 C 项目,则是 .disco。

在 Visual Studio .NET 中创建 Web 服务

在 File(文件)菜单上,选择 New(新建)以显示 New Project(新建项目)对话框,如图 5 所示。


 

图 5:Visual Studio .NET New Project(新建项目)对话框

在 Visual Basic Projects(项目)部分中,选择 ASP.NET Web 服务。

在 Name(名称)框中,给出项目名称 (MigratetoDotNetService)。

为 Web 服务输入 Web 站点 URL (localhost/customer)。

单击 OK(确定),创建项目。默认情况下,项目包含名为 Service1.asmx 的模块。

右键单击 Service1.asmx 模块,并从菜单中选择 View Code(查看代码)。

将此代码添加到模块顶部的 Public Class Service1 语句中,如下所示:

<WebService(Namespace:="http://phvis.com/customer/", _
         Description:="客户管理") _
Public Class Service1

从 Visual Basic 6.0 示例中复制 createCustomer 函数,但将 <WebMethod> 属性添加到函数声明中,如下所示:

<WebMethod(Description:= _
   "传递姓名,返回 ID 值")> _
Public Function createCustomer( _
      ByVal First As String, _
      ByVal Last As String) As String

只需要更改一处,就可以将 Visual Basic 6.0 代码转换成 Visual Basic .NET 语法。使用 Return 替换函数中的 createCustomer =,如下所示:

   Return "A" & CStr(Len(First)) & _
                        CStr(Len(Last))
End Function

在 Build(生成)菜单上,选择 Build(生成)以创建 Web 服务。在 Output(输出)窗口中检查生成过程中的错误。作为生成的一部分,还会生成应用程序的发现文件。

创建客户端

无需创建 .NET 客户端,用 SOAP Toolkit 创建的 Visual Basic 6.0 应用程序就可以访问 .NET Web 服务。以下步骤将展示如何为 Web 服务创建 .NET 客户端(与 Web 服务是用 Visual Basic 6.0 还是用 Visual Basic .NET 编写无关):

在 File(文件)菜单上,选择 New(新建),然后选择 Project(项目)以显示 Add Project(添加项目)对话框。

在 Visual Basic Projects(项目)部分,选择 Windows Application(Windows 应用程序)。

在 Name(名称)框中给出项目名称 (MigratetoWebClient),然后单击 OK(确定)以创建项目。

在 Solution Explorer(解决方案资源管理器)中,右键单击此项目并选择 Add Web Reference(添加 Web 引用)。将显示 Add Web Reference(添加 Web 引用)对话框,如图 6 所示。


 

图 6:Add Web Reference(添加 Web 引用)对话框

在 Address(地址)框中输入 Web 服务项目的 .vsdisco 文件的 URL。例如,http://localserver/customers/MigratetoNetService.vsdisco。单击 Address(地址)框末尾的箭头选取引用。

注意:通过将 .vsdisco 文件从 Solution Explorer(解决方案资源管理器)拖动到代码模块中,也可以获得 Web 服务项目的 .vsdisco 文件的 URL。这会将文件的 URL 添加到代码模块中。然后,从模块中剪切 URL,并将其粘贴到 Add Web Reference(添加 Web 引用)对话框的 Address(地址)框中。

单击 Add Reference(添加引用)按钮返回项目。对 Web 服务的引用将显示在 Solution Explorer(解决方案资源管理器)中,如图 7 所示。


 
图 7:包含一个 Web 服务引用的 Visual Basic Windows 应用程序

向窗体添加名为 txtFirstName 和 txtLastName 的文本框,用于存放客户的姓名,并为调用 Web 服务的代码添加一个按钮。

添加代码以声明引用代理类的变量,此代理类处理 Web 服务(代理类的默认名称由服务器名称和服务名称组成):

Private Sub cmdCreate_Click()
Dim cc As localhost.service1

添加代码,实例化代理类并调用 Web 服务的方法:

Set cc = New localhost.service1
Me.txtCustId.text = _
       cc.createCustomer(Me.txtFirstName.Text, _
                     Me.txtLastName.Text)
End Sub

按 F5,运行客户端并访问 Web 服务。

从 SOAP Toolkit 转换到 Visual Studio .NET

使用 SOAP Toolkit 或 .NET Web 服务生成的应用程序符合 SOAP 规范。使用基于 SOAP 的应用程序时,客户端和 Web 服务之间的连接由 WSDL 文件定义。使用 .NET 生成的 Web 服务可以使用由 SOAP Toolkit 生成的 Web 服务,反之亦然。这使您可以通过存放服务常量的 WSDL 定义,逐步从 SOAP Toolkit 迁移到 .NET。例如,在 Web 服务转换到 .NET 的同时,访问 Web 服务的客户端能继续使用 SOAP Toolkit 的 SOAPClient。

存放 Web 服务常量的 WSDL 文件的最简单方法是,将 Visual Basic 6.0 代码复制到 Web 服务的 asmx 模块中。复制完成后,必须将 <WebService> 和 <WebMethod> 属性添加到类模块中,以创建 .NET Web 服务。然后,需要将 Visual Basic 6.0 代码转换成 .NET 语法,如 MSDN 和本系列的其他文章所述。如果您想创建全新的 .NET 版的 Web 服务,可以使用 SOAP Toolkit 版的 WSDL 文件生成 Web 服务的基本代码。

在客户端,访问 Web 服务的不同客户端应用程序可以分别从 SOAP Toolkit 转换到 .NET。由于 SOAP 规范提供的互操作性,即使由一个客户端生成了多个 .NET 版本,也不会产生问题。要在客户端内从 SOAP Toolkit 转换到 Visual Studio .NET,必须用对 Web 服务代理的引用替换对 SOAPClient 的引用。

小结

您已经了解了如何从 Visual Basic 6.0 和 Visual Basic .NET 访问 Web 服务。还了解了将现有的 SOAP 应用程序转换到 .NET 平台所需完成的操作。

重点要记住的是以下三点:

WSDL 文件用于描述可以发送到 Web 服务的 SOAP 文档。在 Visual Basic 6.0 中,可以使用 SOAP Toolkit 的 WSDL Generator 创建此文件;在 Visual Studio .NET 中,将为您自动生成此文件。

在 Visual Basic 6.0 中创建 Web 服务时,需要 Microsoft WSML 文件和单独的 ASP 侦听器页;在 Visual Studio .NET 中创建 ASP.NET Web 服务时,两者都不需要。

可以随意混用客户端和服务,而不必考虑平台。可以使用 SoapClient,从 Visual Basic 6.0 客户端或 ASP 页调用 Visual Basic .NET Service,并且您的 Visual Basic 6.0 Web 服务可以使用 SoapServer 处理来自 Visual Studio .NET 客户端的请求。

关于作者

Peter Vogel (MBA, MCSD) 是 PH&V 信息服务的负责人。PH&V 专门从事基于 COM/COM+ 的系统的系统设计和开发。Peter 曾经为 Bayer AG、Exxon、Christie Digital 和 Canadian Imperial Bank of Commerce 设计、构建和安装 Intranet 和基于组件的系统。他还是《Smart Access》和《XML Developer》时事通讯的编辑,著有《The Visual Basic Object and Component Handbook》(Prentice Hall),现在正在撰写《User Interface Design》(APress)。Peter 在 Learning Tree International 从事教学工作。他的文章发表在有关 Visual Basic 开发的各主要杂志上,还发表在 Microsoft Developer Network? (MSDN) Library 中。Peter 还出席北美洲、澳大利亚和欧洲的会议。

关于 Informant Communications Group

Informant Communications Group, Inc. (www.informant.com) 是一家专注于信息技术行业的多媒体公司。它成立于 1990 年,专门从事软件开发出版物、会议、目录发布和 Web 站点等业务。ICG 在美国和英国均设有办事处,目前已成为享有盛誉的媒体和营销内容集成商,并以高质量的技术信息满足 IT 人员不断增长的需求。

相关推荐