摘要:如何從 Visual Basic 6.0 和 Visual Basic .NET 訪問(wèn) Web 服務(wù),以及如何將現(xiàn)有的 SOAP 應(yīng)用程序轉(zhuǎn)換到 .NET 平臺(tái)。
目標(biāo) 了解 Microsoft® Visual Studio® .NET 中的 SOAP 工具 回顧使用 SOAP 和 Visual Basic® 6.0 訪問(wèn) COM/COM+ 組件 從 Visual Basic .NET 訪問(wèn) Web 服務(wù) 將 SOAP Toolkit 應(yīng)用程序遷移到 Web 服務(wù) 前提條件 了解什么是 Web 服務(wù) 精通并且可以訪問(wèn) Visual Basic 6.0 和 SOAP,且知道如何創(chuàng)建 ActiveX® DLL 項(xiàng)目 熟悉有關(guān) Visual Studio .NET 的基礎(chǔ)知識(shí) Web 服務(wù)、SOAP 和您的工具 Web 服務(wù)提供了可以通過(guò) Internet 訪問(wèn)的功能,即調(diào)用 Web 服務(wù)并獲取返回的結(jié)果。Web 服務(wù)的新增功能是,您現(xiàn)在可以連接到世界最大網(wǎng)絡(luò) Internet 上的服務(wù)。不過(guò),作為一名 Visual Basic 程序員,Web 服務(wù)為您處理了繁瑣的 Internet 事務(wù)。
在本文中,您將了解如何使用 Visual Studio .NET 訪問(wèn) Web 服務(wù)、回顧使用 Visual Basic 6.0 和 SOAP Toolkit 2.0 創(chuàng)建 Web 服務(wù)的過(guò)程,還將了解如何轉(zhuǎn)換現(xiàn)有的 SOAP Toolkit 應(yīng)用程序,以便在 .NET 框架中使用 Web 服務(wù)。
本文使用的 Web 服務(wù)有一個(gè)非常簡(jiǎn)單的函數(shù) createCustomer。它接受客戶(hù)的姓名,并返回客戶(hù)標(biāo)識(shí)符。但是,我們不在這里討論 Web 服務(wù)的功能,以便您可以集中精力了解如何使用 Visual Basic 6.0 或 Visual Basic .NET 創(chuàng)建和訪問(wèn) Web 服務(wù)。
Visual Basic 和 SOAP 用戶(hù)通過(guò)發(fā)送和接收 SOAP 文檔與 Web 服務(wù)通信。在 Visual Basic 6.0 中,有兩種方法可以創(chuàng)建 SOAP 文檔:
通過(guò)連接字符串組合文檔 使用 SOAP Toolkit 2.0 中的 SoapClient SoapClient 不僅創(chuàng)建一個(gè) SOAP 文檔與 Web 服務(wù)通信,還將該文檔發(fā)送到 Web 服務(wù)進(jìn)行處理。
在傳輸?shù)?Web 服務(wù)端,需要一個(gè) SOAP 偵聽(tīng)器捕獲并處理客戶(hù)端發(fā)送的文檔。SOAP Toolkit 2.0 包括 SoapServer,可以在偵聽(tīng)?wèi)?yīng)用程序中使用它處理 SOAP 文檔。偵聽(tīng)器是單獨(dú)創(chuàng)建的應(yīng)用程序,它獨(dú)立于實(shí)現(xiàn) Web 服務(wù)的組件。
使用 Visual Studio .NET,可以簡(jiǎn)化對(duì) Web 服務(wù)的創(chuàng)建和訪問(wèn)。在 Visual Studio .NET 中,創(chuàng)建 Web 服務(wù)并不要求構(gòu)造單獨(dú)的偵聽(tīng)?wèi)?yīng)用程序。在訪問(wèn) Web 服務(wù)時(shí),它會(huì)自動(dòng)為您創(chuàng)建代理,這樣,您使用 Web 服務(wù)就像訪問(wèn)其他任何對(duì)象一樣。
Web 服務(wù)描述工具 Web 服務(wù)描述語(yǔ)言 (WSDL) 是一種 XML 語(yǔ)言,它是專(zhuān)門(mén)為描述 Web 服務(wù)而設(shè)計(jì)的。作為使 Web 服務(wù)成為開(kāi)放式標(biāo)準(zhǔn)的過(guò)程的一部分,WSDL 已連同 SOAP 一起提交到 W3C。對(duì)服務(wù)的 WSDL 描述可以包含 wsdlSpec tModel,它為服務(wù)提供創(chuàng)建和發(fā)送 SOAP 文檔所需的全部信息。以下是支持 createCustomer 函數(shù)的 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> 標(biāo)記指定將請(qǐng)求發(fā)送到哪個(gè) SOAP 偵聽(tīng)器,在本例中,將發(fā)送到 http://localhost/cust/cust.asp 頁(yè)。此文件的前一部分說(shuō)明服務(wù)可以使用的消息。
注意:SOAP 文檔中使用的名稱(chēng)空間 tempuri.org 是一個(gè)臨時(shí)名稱(chēng)空間,僅在開(kāi)發(fā)時(shí)使用 (temporary uri)。在此服務(wù)投入到產(chǎn)品之前,應(yīng)修改 WSDL 文件,使其擁有唯一的 URI(例如,您公司網(wǎng)站的 URL)。 SOAP Toolkit 對(duì)象和 Visual Studio .NET IDE 都讀取 WSDL 文件。SoapClient 使用 WSDL 文件中的信息以使其作為 Web 服務(wù)的代理。Visual Studio .NET 使用同樣的信息為 Web 服務(wù)生成代理類(lèi)。因此,您可以執(zhí)行以下操作:
調(diào)用 Web 服務(wù)的方法,好像它們是這些代理的方法。 發(fā)送消息前,根據(jù) Web 服務(wù)的 WSDL 描述驗(yàn)證調(diào)用。 與代理交互,而不必熟悉 WSDL 文件的內(nèi)容或要生成的 SOAP 文檔。 圖 1 顯示了各個(gè)組件之間的關(guān)系,包括 Web 服務(wù)元語(yǔ)言 (WSML) 文件。只有 Visual Basic 6.0 需要此文件,并在其演練中描述此文件。
圖 1:Web 服務(wù)和客戶(hù)端示意圖
在 SOAP 中,SOAP Toolkit 和 Visual Studio .NET IDE 執(zhí)行類(lèi)似的功能。所不同的是,SOAP Toolkit 對(duì)象不能提供 Visual Basic 開(kāi)發(fā)人員所需的全部支持。在圖 2 中,可以看到 IntelliSense® 支持(Visual Basic 程序員認(rèn)為此類(lèi)支持是必要的)。IntelliSense 下拉列表自動(dòng)顯示 Customerservices COM 對(duì)象的 createCustomer 方法。
圖 2:COM/DCOM/COM+ 對(duì)象的 IntelliSense 支持
在圖 3 中,您可以看到 SoapClient 為 Web 服務(wù)提供的 IntelliSense 支持。所有的 SoapClient 方法均列出,但沒(méi)有顯示將 SoapClient 作為代理的服務(wù)所擁有的方法(即 createCustomer)。
圖 3:使用 SoapClient 的 IntelliSense 支持
如果使用 Visual Studio .NET,由 IDE 生成的代理類(lèi)能夠比 SOAPClient 更好地表示 Web 服務(wù)。在圖 4 中,您可以看到用于訪問(wèn) Web 服務(wù)的 IntelliSense 支持。createCustomer 方法是與 Web 服務(wù)交互的對(duì)象所擁有的方法之一。
圖 4:Visual Studio .NET 中對(duì) Web 服務(wù)的 IntelliSense 支持
SOAP Toolkit 2.0 概述 本節(jié)簡(jiǎn)單回顧了在上一節(jié) Web 服務(wù)、SOAP 和您的工具中介紹的創(chuàng)建 Web 服務(wù)的過(guò)程。
使用 SOAP Toolkit 創(chuàng)建和訪問(wèn) Web 服務(wù) 在 Visual Basic 6.0 中,為 Web 服務(wù)創(chuàng)建名為 CustCP 的新 Visual Basic ActiveX DLL 項(xiàng)目和名為 Customerservices 的類(lèi)模塊及其代碼: 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 向?qū)?WSDL 和 WSML 文件(WSML 文件中包含 SOAPServer 用于從 Web 服務(wù)映射到 ActiveX COM 對(duì)象的信息)。 創(chuàng)建 SOAP 偵聽(tīng)器,作為使用 SOAPServer 的 ASP 頁(yè): <%@ 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, ""%>
創(chuàng)建客戶(hù)端以調(diào)用使用 SOAPClient 的 Web 服務(wù): 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 演練 在本節(jié)中,您將了解如何完成以下操作:
在 Visual Studio .NET 中創(chuàng)建 Web 服務(wù)。 從 Visual Basic .NET 應(yīng)用程序訪問(wèn) Web 服務(wù)。 在 Visual Studio .NET 中生成 Web 服務(wù)時(shí),將為該 Web 服務(wù)自動(dòng)生成一個(gè)“發(fā)現(xiàn)文件”。發(fā)現(xiàn)文件用于向其他 Visual Studio .NET 應(yīng)用程序添加 Web 服務(wù)引用,包括 WSDL 描述。
注意:對(duì)于 Visual Basic 和 C# 項(xiàng)目,發(fā)現(xiàn)文件的文件類(lèi)型是 .vsdisco;對(duì)于 C 項(xiàng)目,則是 .disco。 在 Visual Studio .NET 中創(chuàng)建 Web 服務(wù) 在 File(文件)菜單上,選擇 New(新建)以顯示 New Project(新建項(xiàng)目)對(duì)話(huà)框,如圖 5 所示。
圖 5:Visual Studio .NET New Project(新建項(xiàng)目)對(duì)話(huà)框
在 Visual Basic Projects(項(xiàng)目)部分中,選擇 ASP.NET Web 服務(wù)。 在 Name(名稱(chēng))框中,給出項(xiàng)目名稱(chēng) (MigratetoDotNetService)。 為 Web 服務(wù)輸入 Web 站點(diǎn) URL (localhost/customer)。 單擊 OK(確定),創(chuàng)建項(xiàng)目。默認(rèn)情況下,項(xiàng)目包含名為 Service1.asmx 的模塊。 右鍵單擊 Service1.asmx 模塊,并從菜單中選擇 View Code(查看代碼)。 將此代碼添加到模塊頂部的 Public Class Service1 語(yǔ)句中,如下所示: <WebService(Namespace:="http://phvis.com/customer/", _ Description:="客戶(hù)管理") _ Public Class Service1
從 Visual Basic 6.0 示例中復(fù)制 createCustomer 函數(shù),但將 <WebMethod> 屬性添加到函數(shù)聲明中,如下所示: <WebMethod(Description:= _ "傳遞姓名,返回 ID 值")> _ Public Function createCustomer( _ ByVal First As String, _ ByVal Last As String) As String
只需要更改一處,就可以將 Visual Basic 6.0 代碼轉(zhuǎn)換成 Visual Basic .NET 語(yǔ)法。使用 Return 替換函數(shù)中的 createCustomer =,如下所示: Return "A" & CStr(Len(First)) & _ CStr(Len(Last)) End Function
在 Build(生成)菜單上,選擇 Build(生成)以創(chuàng)建 Web 服務(wù)。在 Output(輸出)窗口中檢查生成過(guò)程中的錯(cuò)誤。作為生成的一部分,還會(huì)生成應(yīng)用程序的發(fā)現(xiàn)文件。 創(chuàng)建客戶(hù)端 無(wú)需創(chuàng)建 .NET 客戶(hù)端,用 SOAP Toolkit 創(chuàng)建的 Visual Basic 6.0 應(yīng)用程序就可以訪問(wèn) .NET Web 服務(wù)。以下步驟將展示如何為 Web 服務(wù)創(chuàng)建 .NET 客戶(hù)端(與 Web 服務(wù)是用 Visual Basic 6.0 還是用 Visual Basic .NET 編寫(xiě)無(wú)關(guān)):
在 File(文件)菜單上,選擇 New(新建),然后選擇 Project(項(xiàng)目)以顯示 Add Project(添加項(xiàng)目)對(duì)話(huà)框。 在 Visual Basic Projects(項(xiàng)目)部分,選擇 Windows Application(Windows 應(yīng)用程序)。 在 Name(名稱(chēng))框中給出項(xiàng)目名稱(chēng) (MigratetoWebClient),然后單擊 OK(確定)以創(chuàng)建項(xiàng)目。 在 Solution Explorer(解決方案資源管理器)中,右鍵單擊此項(xiàng)目并選擇 Add Web Reference(添加 Web 引用)。將顯示 Add Web Reference(添加 Web 引用)對(duì)話(huà)框,如圖 6 所示。
圖 6:Add Web Reference(添加 Web 引用)對(duì)話(huà)框
在 Address(地址)框中輸入 Web 服務(wù)項(xiàng)目的 .vsdisco 文件的 URL。例如,http://localserver/customers/MigratetoNetService.vsdisco。單擊 Address(地址)框末尾的箭頭選取引用。 注意:通過(guò)將 .vsdisco 文件從 Solution Explorer(解決方案資源管理器)拖動(dòng)到代碼模塊中,也可以獲得 Web 服務(wù)項(xiàng)目的 .vsdisco 文件的 URL。這會(huì)將文件的 URL 添加到代碼模塊中。然后,從模塊中剪切 URL,并將其粘貼到 Add Web Reference(添加 Web 引用)對(duì)話(huà)框的 Address(地址)框中。 單擊 Add Reference(添加引用)按鈕返回項(xiàng)目。對(duì) Web 服務(wù)的引用將顯示在 Solution Explorer(解決方案資源管理器)中,如圖 7 所示。
圖 7:包含一個(gè) Web 服務(wù)引用的 Visual Basic Windows 應(yīng)用程序
向窗體添加名為 txtFirstName 和 txtLastName 的文本框,用于存放客戶(hù)的姓名,并為調(diào)用 Web 服務(wù)的代碼添加一個(gè)按鈕。 添加代碼以聲明引用代理類(lèi)的變量,此代理類(lèi)處理 Web 服務(wù)(代理類(lèi)的默認(rèn)名稱(chēng)由服務(wù)器名稱(chēng)和服務(wù)名稱(chēng)組成): Private Sub cmdCreate_Click() Dim cc As localhost.service1
添加代碼,實(shí)例化代理類(lèi)并調(diào)用 Web 服務(wù)的方法: Set cc = New localhost.service1 Me.txtCustId.text = _ cc.createCustomer(Me.txtFirstName.Text, _ Me.txtLastName.Text) End Sub
按 F5,運(yùn)行客戶(hù)端并訪問(wèn) Web 服務(wù)。 從 SOAP Toolkit 轉(zhuǎn)換到 Visual Studio .NET 使用 SOAP Toolkit 或 .NET Web 服務(wù)生成的應(yīng)用程序符合 SOAP 規(guī)范。使用基于 SOAP 的應(yīng)用程序時(shí),客戶(hù)端和 Web 服務(wù)之間的連接由 WSDL 文件定義。使用 .NET 生成的 Web 服務(wù)可以使用由 SOAP Toolkit 生成的 Web 服務(wù),反之亦然。這使您可以通過(guò)存放服務(wù)常量的 WSDL 定義,逐步從 SOAP Toolkit 遷移到 .NET。例如,在 Web 服務(wù)轉(zhuǎn)換到 .NET 的同時(shí),訪問(wèn) Web 服務(wù)的客戶(hù)端能繼續(xù)使用 SOAP Toolkit 的 SOAPClient。
存放 Web 服務(wù)常量的 WSDL 文件的最簡(jiǎn)單方法是,將 Visual Basic 6.0 代碼復(fù)制到 Web 服務(wù)的 asmx 模塊中。復(fù)制完成后,必須將 <WebService> 和 <WebMethod> 屬性添加到類(lèi)模塊中,以創(chuàng)建 .NET Web 服務(wù)。然后,需要將 Visual Basic 6.0 代碼轉(zhuǎn)換成 .NET 語(yǔ)法,如 MSDN 和本系列的其他文章所述。如果您想創(chuàng)建全新的 .NET 版的 Web 服務(wù),可以使用 SOAP Toolkit 版的 WSDL 文件生成 Web 服務(wù)的基本代碼。
在客戶(hù)端,訪問(wèn) Web 服務(wù)的不同客戶(hù)端應(yīng)用程序可以分別從 SOAP Toolkit 轉(zhuǎn)換到 .NET。由于 SOAP 規(guī)范提供的互操作性,即使由一個(gè)客戶(hù)端生成了多個(gè) .NET 版本,也不會(huì)產(chǎn)生問(wèn)題。要在客戶(hù)端內(nèi)從 SOAP Toolkit 轉(zhuǎn)換到 Visual Studio .NET,必須用對(duì) Web 服務(wù)代理的引用替換對(duì) SOAPClient 的引用。
小結(jié) 您已經(jīng)了解了如何從 Visual Basic 6.0 和 Visual Basic .NET 訪問(wèn) Web 服務(wù)。還了解了將現(xiàn)有的 SOAP 應(yīng)用程序轉(zhuǎn)換到 .NET 平臺(tái)所需完成的操作。
重點(diǎn)要記住的是以下三點(diǎn):
WSDL 文件用于描述可以發(fā)送到 Web 服務(wù)的 SOAP 文檔。在 Visual Basic 6.0 中,可以使用 SOAP Toolkit 的 WSDL Generator 創(chuàng)建此文件;在 Visual Studio .NET 中,將為您自動(dòng)生成此文件。 在 Visual Basic 6.0 中創(chuàng)建 Web 服務(wù)時(shí),需要 Microsoft WSML 文件和單獨(dú)的 ASP 偵聽(tīng)器頁(yè);在 Visual Studio .NET 中創(chuàng)建 ASP.NET Web 服務(wù)時(shí),兩者都不需要。 可以隨意混用客戶(hù)端和服務(wù),而不必考慮平臺(tái)。可以使用 SoapClient,從 Visual Basic 6.0 客戶(hù)端或 ASP 頁(yè)調(diào)用 Visual Basic .NET Service,并且您的 Visual Basic 6.0 Web 服務(wù)可以使用 SoapServer 處理來(lái)自 Visual Studio .NET 客戶(hù)端的請(qǐng)求。
|
溫馨提示:喜歡本站的話(huà),請(qǐng)收藏一下本站!