雖然關于SOAP的實現(xiàn)目前有很多種,但是我認為對于VC/VB程序員來說,選擇Microsoft的實現(xiàn)是最好的。先撇開.NET的WebServices的底層庫不談(因為還不熟悉L),我們現(xiàn)在要討論的是Microsoft Soap Toolkit 2.0。 Microsoft Soap Toolkit 2.0提供了一整套的COM對象來處理與SOAP相關的所有數(shù)據(jù),可以讓你在不了解SOAP和XML的情況下(當然最好還是了解的啦),也可以很容易和方便的使用任何一種編程語言來編寫SOAP應用。你看到的,就是一個個的COM對象(符合微軟的風格,符合一般程序員的編程習慣)。 一. 功能簡介: 1. 提供了客戶端的組件,可以讓你指定WSDL,然后輕松調(diào)用對應的Web Service。 2. 提供了服務端的組件,可以讓你指定WSDL、WSML和COM對象,自動為你生成Web Service。 3. 還提供了底層的處理組件,可以讓你操縱SOAP消息的具體創(chuàng)建、處理和傳輸?shù)倪^程。 二. 幾個概念: WSDL(Web Services Description Language):用于描述服務端所提供服務的XML格式。WSDL文件里,描述了服務端提供的服務,提供的調(diào)用方法,以及調(diào)用時所要遵循的格式,比如調(diào)用參數(shù)和返回值的格式等等。WSDL 很像COM編程里的IDL(Interface Description Language),是服務器與客戶端之間的契約,雙方必須按契約嚴格行事才能實現(xiàn)功能。 WSML(Web Services Meta Language): 用于描述WSDL里提供的方法與實現(xiàn)該方法的COM對象之間的映射關系。該文件是Microsoft的實現(xiàn)中特有的,不是SOAP標準的一部分。一般情況下,該文件只在服務端存在。 SOAP消息:客戶端和服務端之間的方法調(diào)用請求和結(jié)果返回值都放在這些消息里,是XML格式的數(shù)據(jù)。 三. Web Service調(diào)用過程: 客戶端:取得服務端的服務描述文件WSDL,解析該文件的內(nèi)容,了解服務端的服務信息,以及調(diào)用方式。根據(jù)需要,生成恰當?shù)腟OAP請求消息(指定調(diào)用的方法,已經(jīng)調(diào)用的參數(shù)),發(fā)往服務端。等待服務端返回的SOAP回應消息,解析得到返回值。 服務端:生成服務描述文件,以供客戶端獲取。接收客戶端發(fā)來的SOAP請求消息,解析其中的方法調(diào)用和參數(shù)格式。根據(jù)WSDL和WSML的描述,調(diào)用相應的COM對象來完成指定功能,并把返回值放入SOAP回應消息返回給用戶。 四. 編程的兩種模式 高層接口 使用高層接口,你不需要知道SOAP和XML的任何信息,就可以生成和使用一個WebService。Soap Toolkit 2.0通過提供兩個COM對象――SoapClient和SoapServer,來完成這些功能。 在客戶端,你只需要生成一個SoapClient實例,并用WSDL作為參數(shù)來調(diào)用其中的mssoapinit方法。SoapClient對象會自動解析WSDL文件,并在內(nèi)部生成所有Web Service的方法和參數(shù)信息。之后,你就可以像調(diào)用IDispatch接口里的方法一樣,調(diào)用里面所有的方法。在VB或是腳本語言里,你甚至可以直接在SoapClient對象名后面直接加上.方法(參數(shù)…)進行調(diào)用。 在服務端,有兩種處理模式。一種是生成ASP文件;另一種是直接使用ISAPI擴展,讓Soap Toolkit提供的DLL來處理對WSDL的請求。 在第一種模式中,你需要在ASP文件里創(chuàng)建SoapServer對象,并用WSDL和WSML作為參數(shù)來調(diào)用Init方法,SoapServer在內(nèi)部會自動建立相關的映射關系。然后,用ASP的Request和Response對象作為參數(shù)調(diào)用SoapInvoke方法。SoapServer會自動從Request里取得用戶的SOAP請求消息,并解析,調(diào)用相應的COM完成功能,把返回值封裝成SOAP回應消息,通過Response對象返回。 在第二種模式中,Soap Toolkit提供的ISAPI擴展會自動完成以上ASP模式的全部操作。 兩種模式的比較是,第一種比較靈活,但是速度比較慢。而第二種雖然靈活性沒有了,但是性能卻很高。所以,如果沒有特殊都請使用ISAPI模式。 低層接口 要使用低層接口,你必須對SOAP和XML有所了解。你可以對SOAP的處理過程進行控制,特別是要做特殊處理的時候。 在客戶端,首先要創(chuàng)建一個HttpConnector對象,負責HTTP連接。設定Connector的一些頭部信息,比如EndPoinURL和SoapAction等。如果網(wǎng)絡連接需要使用代理服務器,那也要在這里設定相關的信息。接著創(chuàng)建SoapSerializer對象,用于生成Soap消息。按照WSDL里定義,把所有參數(shù)按順序序列化,得到一個完整的SOAP請求消息。該Soap消息,作為Payload通過HttpConnector被發(fā)送到服務端。最后,生成一個SoapReader對象,負責讀取服務端返回的SOAP消息,取得其中的返回值。 在服務端,首先通過ASP里的Request和Response對象取得HTTP連接的輸入與輸出。接著創(chuàng)建SoapReader對象,讀取Request對象里的Soap請求消息,解析出要調(diào)用的方法和調(diào)用的參數(shù), 執(zhí)行實際的調(diào)用,并取得執(zhí)行結(jié)果。最后,生成一個SoapSerializer對象,按照WSDL的描述,序列化執(zhí)行結(jié)果,生成Soap回應消息,通過Response對象返回給客戶端。 五. 疑問與解答 為什么要有WSML? 答:因為SOAP本身只是對象訪問的協(xié)議,至于實現(xiàn)的方式并沒有指定。一般來說,使用SOAP就是把現(xiàn)有系統(tǒng)的功能以標準的方式對外公開,讓外部能夠訪問。而在微軟的平臺上,為了模塊的互用性,功能的實現(xiàn)一般是以COM的方式提供的。而如何能夠把WSDL里描述的方法,映射到COM的接口方法上,這就是WSML所要做的?,F(xiàn)在你可以看到,使用WSML,你不需要做太多工作,就可以把現(xiàn)有的應用很快的變成Web Service應用。在服務端,你完全保留了Microsoft的COM/COM+應用模式。(當然,WSML也不是必須的,如果你不需要使用COM的方法映射。如果你不使用Soap Toolkit的高層接口,而使用底層接口。那就沒有必要了。) 如何處理復雜的數(shù)據(jù)類型? 答:你可以自己實現(xiàn)一個自定義的類型映射COM對象(Custom Type Mapper),并在WSML里進行指定。這樣,Soap Toolkit在處理過程當中,會調(diào)用這個Mapper對SOAP消息里的消息進行處理。比如要返回一個復雜數(shù)據(jù),在服務端,Toolkit要懂得如何把一個復雜數(shù)據(jù)類型序列化為XML節(jié)點。而在客戶端,Toolkit要懂得如何把XML節(jié)點重新表示為一個復雜的數(shù)據(jù)結(jié)構(gòu)。 需要說明的是,這個映射對象(Mapper)并不是必須的,只是為了使用的方便而使用。也就是說,雙方只要嚴格遵循WSDL里描述的規(guī)范,就一定能夠達到調(diào)用成功。而不管你客戶和服務端是如何映射這個復雜數(shù)據(jù)類型的,是一個C結(jié)構(gòu)體也好,是一個COM對象也好,或是一個Java的類也好,都是無關緊要的。 六. 關于Soap Toolkit的例子 Toolkit自帶的例子已經(jīng)非常全面,解釋了使用這個Toolkit需要了解的各種調(diào)用方式。通過看微軟提供的代碼,并親自運行一遍,就會對該Soap Toolkit有比較感性的認識了。 不過,需要提醒你的是,要能正確運行附帶的例子,你必須安裝有IIS服務,并且還要根據(jù)要求創(chuàng)建虛擬目錄和映射主機名。具體請參見Sample頁的安裝說明(Setup Instructions)。 七. Soap Toolkit的兩個工具 WSDL Generator: 該工具是Toolkit自帶的,主要的功能就是可以把一個COM對象作為一個Web Service發(fā)布,用于服務端的開發(fā)。 你只要指定了COM對象以及要輸出的接口函數(shù),和發(fā)布的網(wǎng)址等信息,該工具就會自動生成對應的WSDL和WSML文件。你只要把WSDL和WSML拷貝到對應的虛擬目錄下,一個Web Service就完成了----該工具避免了手動書寫WSDL和WSML的麻煩,但是由于該版本還無法實現(xiàn)復雜數(shù)據(jù)類型的映射。所以如果有復雜數(shù)據(jù)類型的情況,你還是要手動修改的。 Web Service Proxy Wizard: 該工具是在Toolkit之后才發(fā)布的,所以你需要單獨下載(地址見附錄)。該工具完成的功能正好與WSDL Generator相反,是為一個WSDL文件生成相應的COM訪問對象,用于客戶端的開發(fā)。 你只要指定要調(diào)用WebService的WSDL文件,該工具就會自動生成一個ATL的COM對象類(Proxy對象)。而通過調(diào)用生成的Proxy對象,就可以實現(xiàn)對Web Service的調(diào)用。而在這個Proxy對象里,是通過調(diào)用Soap Toolkit的底層接口來完成整個的Soap調(diào)用過程的。而且,由于生成的是一個VC的ATL COM Object工程,你可以再進行修改,并要進行編譯而生成最后的COM對象。 使用Web Service Proxy Wizard的好處就是可以在Web Service的調(diào)用進行前期綁定,從而提高了調(diào)用效率。而且,其他的模塊只需要調(diào)用這個Proxy對象,就可以實現(xiàn)對Web Service的調(diào)用,而不用跟Soap Toolkit有任何的直接聯(lián)系。對其他調(diào)用模塊來說,Proxy對象就是那個遠端的Web Service,跟一般的本地調(diào)用沒什么兩樣。 八. 結(jié)論: 以上,我們僅僅是對Microsoft SOAP Toolkit 2.0進行了概要介紹。要真正掌握,還需不斷的實踐。我們將在后續(xù)的文章中對如何實作進行詳細介紹。 附錄: Microsoft Soap Toolkit 2.0的下載地址:http://msdn.microsoft.com/downloads/default.ASP?URL=/code/sample.asp?url=/msdn-files/027/001/580/msdncompositedoc.XML MSDN上的Soap專題: http://msdn.microsoft.com/soap/ 微軟SoapSDK的新聞組:http://msdn.microsoft.com/newsgroups/default.ASP?url=/newsgroups/loadframes.asp?ICP=msdn&sLCID=us&NewsGroup=microsoft.public.XML.soapsdk&frame=true Web Service Proxy Wizard的下載地址: http://msdn.microsoft.com/library/default.ASP?url=/library/en-us/dnvs600/HTML/webservproxwiz.asp?frame=true VB Web Services Proxy Generator(在新聞組上發(fā)現(xiàn)的,沒有經(jīng)過測試) http://www.VBXML.com/downloads/default.ASP?id=v2001510204034 |
|