从SOAP Toolkit移植到Web 服务
升级到微软 .NET
Peter Vogel
PH&V信息服务公司
2002年1月
概述: 本文讨论如如何从Microsoft Visual Basic 6.0 和 Visual Basic .NET中访问Web服务,如何将现有SOAP应用程序转换到微软.NET平台。
目标
学习Microsoft® Visual Studio® .NET中的SOAP工具
回顾利用SOAP 和 Microsoft Visual Basic® 6.0访问COM/COM+组件
从Microsoft Visual Basic .NET中访问Web服务
将SOAP工具包应用程序移植到Web服务
要求
为了充分利用本文,读者必须具备以下基础:
理解何为Web服务
使用过Visual Basic 6.0 及 SOAP,知道如何创建Microsoft ActiveX® DLL工程
熟悉Visual Studio .NET基本知识
目录
Web服务、SOAP及你自己的工具
Web 服务描述工具
SOAP Toolkit 2.0 简介
Visual Basic .NET纵观
创建客户端
从 SOAP Toolkit 转换到Visual Studio .NET
小结
Web 服务 SOAP及用户自己的工具
Web服务提供了函数,通过互联网可以访问这些函数——调用Web服务,然后得到返回结果。Web服务中的新内容是通过全球最大的网络——Internet可以链接到这些服务。然而,作为Visual Basic程序员Web服务将为你处理所有利用互联网的烦琐细节。
本文将讨论如何利用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文档:
1. 通过串联字符串来装配文档
2. 利用SOAP Toolkit 2.0版中的SoapClient
SoapClient不仅能创建与Web服务通讯的SOAP文档,还能将文档发送到Web服务进行处理。
在传递中的Web服务端,需要利用SOAP接收器捕获并处理由客户端发送的文档。SOAP Toolkit 2.0版中包含了SoapServer,利用此程序接收器应用程序就能处理SOAP文档。接收器是一个独立的应用程序,它独立于实现了Web服务的组件。
利用Visual Studio .NET,创建和访问Web服务就变得简单了。在Visual Studio .NET中,创建Web服务并不需要构建独立的接收器应用程序。当访问Web服务时,代码将自动创建,这样使用Web服务就象访问其它对象一样。
Web 服务描述工具
Web服务描述语言(WSDL)是专门为描述Web服务而设计的XML语言。WSDL已经同SOAP一同提交给了W3C,这只是使Web服务成为开放标准的一部分。服务的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(如,公司站点的URI)。
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需要WSML,并在Visual Basic 6.0中进行了描述。
图 1. Web 服务及客户结构
在SOAP中,SOAP Toolkit 和Visual Studio .NET IDE执行类似的功能。然而,SOAP Toolkit对象并没有提供Visual Basic开发人员所期望的完整支持。在图2中可以看到Visual Basic程序员认为理所当然的IntelliSense®支持。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服务
1. 在Visual Basic 6.0中,创建一个新Visual Basic ActiveX DLL工程,取名为CustCP,Web服务代码中的类模块取名为Customerservices。
Public Function createCustomer(ByVal First As String, _
ByVal Last As String) As String
createCustomer = "A" & CStr(Len(First)) & _
CStr(Len(Last))
End Function
2. 利用SOAP Toolkit中的 WSDL向导创建WSDL及WSDM文件(WSML文件中包含了SOAPServer用于将Web服务映射为ActiveX COM对象的信息)。
3. 创建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, ""%>
4. 创建调用Web服务的客户,它将使用SOAPClient。
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 Studio .NET应用程序中访问Web服务。
在Visual Studio .NET中创建Web服务时,将自动为Web服务生成一个discovery文件。此文件用于添加Web服务对其它Visual Studio .NET应用程序的引用,包括WSDL描述。
注意 discovery文件的文件类型,对于Visual Basic 及 C#工程是.vsdisco,对于C工程则是.disco。
在 Visual Studio .NET中创建Web服务
1. 从File菜单中选择New,显示New Project对话框,如图5所示。
图 5. Visual Studio .NET New Project 对话框
2. 在Visual Basic Projects部分中选择ASP.NET Web服务。
3. 在Name框中为工程指定名称(MigratetoDotNetService)。
4. 输入Web服务网站的URL (localhost/customer)。
5. 单击OK创建工程。默认地,工程将包含一个名为的模块Service1.asmx。
6. 右击Service1.asmx模块,并从菜单中选择View Code。
7. 将下面的代码添加到模块上部的Public Class Service1语句之后:
<WebService(Namespace:="http://phvis.com/customer/", _
Description:="Customer management") _
Public Class Service1
就象在从SOAP Toolkit转换到Visual Studio .NET节所讨论过的,利用Wsdl.exe实用程序可以从现有WSDL文件中生成Web服务程序的结构。从Visual Basic 6.0示例中拷贝createCustomer函数,但在函数声明中添加<WebMethod>属性,如下:
<WebMethod(Description:= _
"Passed first name and last name, return an id")> _
Public Function createCustomer( _
ByVal First As String, _
ByVal Last As String) As String
8. 从Visual Basic 6.0代码转换为Visual Basic .NET只需修改一处。将函数中的createCustomer =用Return代替,如下所示:
9. Return "A" & CStr(Len(First)) & _
10. CStr(Len(Last))
11. End Function
12. 从Build菜单中选择Build创建Web服务。查看Output窗口,检查建立中的错误。Discovery文件被创建为此构建的一部分。
创建客户
不必创建.NET客户——利用SOAP Toolkit创建的Visual Basic 6.0应用程序能够访问XML Web服务。下面这些步骤演示了如何为Web服务创建.NET客户,而不必考虑Web服务是在Visual Basic 6.0 还是在 Visual Basic .NET中编写的:
1. 从File菜单中,选择New,然后选择Project,显示Add Project对话框。
2. 从Visual Basic Projects部分中,选择Windows Application。
3. 在Name框中指定工程名(MigratetoWebClient),单击OK创建工程。
4. 在方案管理器中右击工程,然后选择Add Web Reference。Add Web Reference对话框出现,如图6所示。
图 6. Add Web Reference 对话框
5. 在Address框中输入Web服务工程中.vsdisco文件的URL——例如http://localserver/customers/MigratetoNetService.vsdisco。单击Address框尾部的下拉箭头,选择引用。
注意 通过将.vsdisco文件从方案管理器拖放到代码模块中,也可以得到Web服务工程中.vsdisco文件的URL。然后在模块中剪切URL,然后将它粘贴到Add Web Reference对话框中的Address框。
6. 单击Add Reference按钮返回工程。对Web服务的引用就出现在方案管理器中,如图7所示。
图 7. 引用了 Web 服务之后的Visual Basic Windows应用程序
7. 在窗体上,文本框txtFirstName 和 txtLastName用于保存客户姓名,按钮代码调用Web服务。
8. 添加代码,声明变量,用此变量引用处理Web服务的代理类(默认类名由服务器名和Web服务名组件):
Private Sub cmdCreate_Click()
Dim cc As localhost.service1
9. 添加代码初始化代理类,调用Web服务的方法:
Set cc = New localhost.service1
Me.txtCustId.text = _
cc.createCustomer(Me.txtFirstName.Text, _
Me.txtLastName.Text)
End Sub
10. 按F5运行客户端应用程序,访问Web服务。
从 SOAP Toolkit 转换到 Visual Studio .NET
利用SOAP Toolkit 或 XML Web服务构建的应用程序符合SOAP准则。对于基于SOAP的应用程序,客户与Web服务间的链接专门由WSDL文件定义。用SOAP Toolkit构建的Web服务可以被用.NET构建的Web服务调用,反之亦然。这样保留服务常量的WSDL定义,就可以分批将SOAP Toolkit应用程序移植到.NET中。例如,访问Web服务的客户仍可以使用SOAP Toolkit中的 SOAPClient客户端,同时将Web服务转换为.NET中。
保留Web服务常量WSDL文件最简单的方法是从SOAP Toolkit创建的WSDL文件中生成Web服务的结构。如果向此应用程序传递如下参数,.NET Wsdl.exe实用程序将为Web服务生成Visual Basic .NET结构:
/l 参数。控制生成代码的语言。默认是C#。传递/l:VB参数会生成Visual Basic代码。
/server 参数。指示程序生成Web服务的服务器端代码(原文有残)。默认是生成客户端代理。
WSDL文件名。
要从Cust.wsdl文件中为示例Web服务创建代码,使用:
wsdl.exe /l:VB /server cust.wsdl
生成的结构代码将保存在Cust.vb文件中。可以将代码从此文件中拷贝ASMX模块中,然后将Visual Basic 6.0代码拷贝到ASMX模块中的同一程序中。如果要创建完整的.NET版本的Web服务,由SOAP Toolkit生成的WSDL文件可用于为Web服务生成结构代码。
在客户端,访问Web服务的不同客户应用程序可以分别从SOAP Toolkit 转换到.NET中。甚至单个客户端向.NET的转换也可以分期进行,因为SOAP准则提供了交互操作性。在客户端要将应用程序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服务时,需要微软WSML文件和独立的ASP接收器网页。而在Visual Studio .NET中创建Web服务时,两个文件都不需要。
客户和服务可以自由混合而不管平台如何。利用SoapClient可以从Visual Basic 6.0 客户端或ASP页中调用Visual Basic .NET服务。Visual Basic 6.0 Web服务也可以利用SoapServer处理来自Visual Studio .NET 客户的请求。
Wsdl.exe实用程序用于从被SOAP应用程序使用的WSDL文件中为.NET版本的Web服务创建结构。
关于作者
Peter Vogel (MBA, MCSD)是PH&V信息服务公司的主要负责人。PH&V专门设计和开发基于COM/COM+的系统。Peter已经为Bayer AG、Exxon、Christie Digital以及Canadian Imperial Bank of Commerce设计、构建和安装了基于企业内部网和组件的系统。他还是Smart Access and 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)库。Peter还经常出席在北美、澳大利亚及欧洲的会议。
关于 Informant 通讯集团
Informant通讯集团公司(www.informant.com)是以信息技术领域为核心的多样化媒体公司。它成立于1990年,并专注于软件开发出版物,讨论会,目录发行和网站。在美国和英国设有办事机构,ICG成为一家受欢迎的媒体公司,并销售目录集成器,满足了IT专业人员对于高质量技术信息不断增长的需求。
版权所有 © 2002 Informant通讯集团公司和微软公司
技术编辑:PDSA公司及 KNG Consulting公司