Microsoft SOAP Toolkit 2.0介紹 (轉)
2024-07-21 02:25:11
供稿:網友
雖然關于soap的實現目前有很多種,但是我認為對于vc/vb程序員來說,選擇microsoft的實現是最好的。先撇開.net的webservices的底層庫不談(因為還不熟悉l),我們現在要討論的是microsoft soap toolkit 2.0。
microsoft soap toolkit 2.0提供了一整套的com對象來處理與soap相關的所有數據,可以讓你在不了解soap和xml的情況下(當然最好還是了解的啦),也可以很容易和方便的使用任何一種編程語言來編寫soap應用。你看到的,就是一個個的com對象(符合微軟的風格,符合一般程序員的編程習慣)。
一. 功能簡介:
1. 提供了客戶端的組件,可以讓你指定wsdl,然后輕松調用對應的web service。
2. 提供了服務端的組件,可以讓你指定wsdl、wsml和com對象,自動為你生成web service。
3. 還提供了底層的處理組件,可以讓你操縱soap消息的具體創建、處理和傳輸的過程。
二. 幾個概念:
wsdl(web services description language):用于描述服務端所提供服務的xml格式。wsdl文件里,描述了服務端提供的服務,提供的調用方法,以及調用時所要遵循的格式,比如調用參數和返回值的格式等等。wsdl 很像com編程里的idl(interface description language),是服務器與客戶端之間的契約,雙方必須按契約嚴格行事才能實現功能。
wsml(web services meta language): 用于描述wsdl里提供的方法與實現該方法的com對象之間的映射關系。該文件是microsoft的實現中特有的,不是soap標準的一部分。一般情況下,該文件只在服務端存在。
soap消息:客戶端和服務端之間的方法調用請求和結果返回值都放在這些消息里,是xml格式的數據。
三. web service調用過程:
客戶端:取得服務端的服務描述文件wsdl,解析該文件的內容,了解服務端的服務信息,以及調用方式。根據需要,生成恰當的soap請求消息(指定調用的方法,已經調用的參數),發往服務端。等待服務端返回的soap回應消息,解析得到返回值。
服務端:生成服務描述文件,以供客戶端獲取。接收客戶端發來的soap請求消息,解析其中的方法調用和參數格式。根據wsdl和wsml的描述,調用相應的com對象來完成指定功能,并把返回值放入soap回應消息返回給用戶。
四. 編程的兩種模式
高層接口
使用高層接口,你不需要知道soap和xml的任何信息,就可以生成和使用一個webservice。soap toolkit 2.0通過提供兩個com對象――soapclient和soapserver,來完成這些功能。
在客戶端,你只需要生成一個soapclient實例,并用wsdl作為參數來調用其中的mssoapinit方法。soapclient對象會自動解析wsdl文件,并在內部生成所有web service的方法和參數信息。之后,你就可以像調用idispatch接口里的方法一樣,調用里面所有的方法。在vb或是腳本語言里,你甚至可以直接在soapclient對象名后面直接加上.方法(參數…)進行調用。
在服務端,有兩種處理模式。一種是生成asp文件;另一種是直接使用isapi擴展,讓soap toolkit提供的dll來處理對wsdl的請求。
在第一種模式中,你需要在asp文件里創建soapserver對象,并用wsdl和wsml作為參數來調用init方法,soapserver在內部會自動建立相關的映射關系。然后,用asp的request和response對象作為參數調用soapinvoke方法。soapserver會自動從request里取得用戶的soap請求消息,并解析,調用相應的com完成功能,把返回值封裝成soap回應消息,通過response對象返回。
在第二種模式中,soap toolkit提供的isapi擴展會自動完成以上asp模式的全部操作。
兩種模式的比較是,第一種比較靈活,但是速度比較慢。而第二種雖然靈活性沒有了,但是性能卻很高。所以,如果沒有特殊都請使用isapi模式。
低層接口
要使用低層接口,你必須對soap和xml有所了解。你可以對soap的處理過程進行控制,特別是要做特殊處理的時候。
在客戶端,首先要創建一個httpconnector對象,負責http連接。設定connector的一些頭部信息,比如endpoinurl和soapaction等。如果網絡連接需要使用代理服務器,那也要在這里設定相關的信息。接著創建soapserializer對象,用于生成soap消息。按照wsdl里定義,把所有參數按順序序列化,得到一個完整的soap請求消息。該soap消息,作為payload通過httpconnector被發送到服務端。最后,生成一個soapreader對象,負責讀取服務端返回的soap消息,取得其中的返回值。
在服務端,首先通過asp里的request和response對象取得http連接的輸入與輸出。接著創建soapreader對象,讀取request對象里的soap請求消息,解析出要調用的方法和調用的參數, 執行實際的調用,并取得執行結果。最后,生成一個soapserializer對象,按照wsdl的描述,序列化執行結果,生成soap回應消息,通過response對象返回給客戶端。
五. 疑問與解答
為什么要有wsml?
答:因為soap本身只是對象訪問的協議,至于實現的方式并沒有指定。一般來說,使用soap就是把現有系統的功能以標準的方式對外公開,讓外部能夠訪問。而在微軟的平臺上,為了模塊的互用性,功能的實現一般是以com的方式提供的。而如何能夠把wsdl里描述的方法,映射到com的接口方法上,這就是wsml所要做的。現在你可以看到,使用wsml,你不需要做太多工作,就可以把現有的應用很快的變成web service應用。在服務端,你完全保留了microsoft的com/com+應用模式。(當然,wsml也不是必須的,如果你不需要使用com的方法映射。如果你不使用soap toolkit的高層接口,而使用底層接口。那就沒有必要了。)
如何處理復雜的數據類型?
答:你可以自己實現一個自定義的類型映射com對象(custom type mapper),并在wsml里進行指定。這樣,soap toolkit在處理過程當中,會調用這個mapper對soap消息里的消息進行處理。比如要返回一個復雜數據,在服務端,toolkit要懂得如何把一個復雜數據類型序列化為xml節點。而在客戶端,toolkit要懂得如何把xml節點重新表示為一個復雜的數據結構。
需要說明的是,這個映射對象(mapper)并不是必須的,只是為了使用的方便而使用。也就是說,雙方只要嚴格遵循wsdl里描述的規范,就一定能夠達到調用成功。而不管你客戶和服務端是如何映射這個復雜數據類型的,是一個c結構體也好,是一個com對象也好,或是一個java的類也好,都是無關緊要的。
六. 關于soap toolkit的例子
toolkit自帶的例子已經非常全面,解釋了使用這個toolkit需要了解的各種調用方式。通過看微軟提供的代碼,并親自運行一遍,就會對該soap toolkit有比較感性的認識了。
不過,需要提醒你的是,要能正確運行附帶的例子,你必須安裝有iis服務,并且還要根據要求創建虛擬目錄和映射主機名。具體請參見sample頁的安裝說明(setup instructions)。
七. soap toolkit的兩個工具
wsdl generator: 該工具是toolkit自帶的,主要的功能就是可以把一個com對象作為一個web service發布,用于服務端的開發。
你只要指定了com對象以及要輸出的接口函數,和發布的網址等信息,該工具就會自動生成對應的wsdl和wsml文件。你只要把wsdl和wsml拷貝到對應的虛擬目錄下,一個web service就完成了----該工具避免了手動書寫wsdl和wsml的麻煩,但是由于該版本還無法實現復雜數據類型的映射。所以如果有復雜數據類型的情況,你還是要手動修改的。
web service proxy wizard: 該工具是在toolkit之后才發布的,所以你需要單獨下載(地址見附錄)。該工具完成的功能正好與wsdl generator相反,是為一個wsdl文件生成相應的com訪問對象,用于客戶端的開發。
你只要指定要調用webservice的wsdl文件,該工具就會自動生成一個atl的com對象類(proxy對象)。而通過調用生成的proxy對象,就可以實現對web service的調用。而在這個proxy對象里,是通過調用soap toolkit的底層接口來完成整個的soap調用過程的。而且,由于生成的是一個vc的atl com object工程,你可以再進行修改,并要進行編譯而生成最后的com對象。
使用web service proxy wizard的好處就是可以在web service的調用進行前期綁定,從而提高了調用效率。而且,其他的模塊只需要調用這個proxy對象,就可以實現對web service的調用,而不用跟soap toolkit有任何的直接聯系。對其他調用模塊來說,proxy對象就是那個遠端的web service,跟一般的本地調用沒什么兩樣。
八. 結論:
以上,我們僅僅是對microsoft soap toolkit 2.0進行了概要介紹。要真正掌握,還需不斷的實踐。我們將在后續的文章中對如何實作進行詳細介紹。
附錄:
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(在新聞組上發現的,沒有經過測試)
http://www.vbxml.com/downloads/default.asp?id=v2001510204034