从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公司

|