典型的Web Service結(jié)構(gòu)。 不管你的Web service是用什么工具,什么語(yǔ)言寫出來的,只要你用SOAP協(xié)議通過HTTP來調(diào)用它,總體結(jié)構(gòu)都應(yīng)如下圖所示。通常,你用你自己喜歡的語(yǔ)言(如VB 6或者VB.NET)來構(gòu)建你的Web service,然后用SOAP Toolkit或者.NET的內(nèi)建支持來把它暴露給Web客戶。于是,任何語(yǔ)言,任何平臺(tái)上的客戶都可以閱讀其WSDL文檔,以調(diào)用這個(gè)Web service??蛻舾鶕?jù)WSDL描述文檔,會(huì)生成一個(gè)SOAP請(qǐng)求消息。Web service都是放在Web服務(wù)器 (如IIS) 后面的,客戶生成的SOAP請(qǐng)求會(huì)被嵌入在一個(gè)HTTP POST請(qǐng)求中,發(fā)送到Web服務(wù)器來。Web服務(wù)器再把這些請(qǐng)求轉(zhuǎn)發(fā)給Web service請(qǐng)求處理器。對(duì)VB 6程序來說,Web service請(qǐng)求處理器是一個(gè)與SOAP Toolkit組件協(xié)同工作的ASP頁(yè)面或ISAPI extension。而對(duì)VB.NET程序來說,Web service請(qǐng)求處理器則是一個(gè).NET Framework自帶的ISAPI extension。請(qǐng)求處理器的作用在于,解析收到的SOAP請(qǐng)求,調(diào)用Web service,然后再生成相應(yīng)的SOAP應(yīng)答。Web服務(wù)器得到SOAP應(yīng)答后,會(huì)再通過HTTP應(yīng)答的方式把它送回到客戶端。 遠(yuǎn)程過程調(diào)用(RPC)與消息傳遞 Web service本身實(shí)際是在實(shí)現(xiàn)應(yīng)用程序間的通信。我們現(xiàn)在有兩種應(yīng)用程序通信的方法:RPC(遠(yuǎn)程過程調(diào)用)和消息傳遞。使用RPC的時(shí)候,客戶端的概念是調(diào)用服務(wù)器上的遠(yuǎn)程過程,通常方式為實(shí)例化一個(gè)遠(yuǎn)程對(duì)象并調(diào)用其方法和屬性。RPC強(qiáng)調(diào)的是遠(yuǎn)程對(duì)象和它的界面,即屬性、方法和調(diào)用時(shí)的參數(shù)。DCOM和.NET遠(yuǎn)程訪問都是RPC的例子。 消息傳遞一般是在耦合度更低的系統(tǒng)中。消息傳遞的概念是,客戶端向服務(wù)器發(fā)送消息,然后等待服務(wù)器的回應(yīng)。消息傳遞系統(tǒng)強(qiáng)調(diào)的是消息的發(fā)送和回應(yīng),而不是遠(yuǎn)程對(duì)象的界面。由于是基于消息的系統(tǒng),客戶端和服務(wù)器之間的耦合度比RPC方法更低。 RPC系統(tǒng)試圖達(dá)到一種位置上的透明性:服務(wù)器暴露出遠(yuǎn)程對(duì)象的接口,而客戶端就好像在使用本地使用的這些對(duì)象的接口一樣,這樣就隱藏了底層的信息,客戶端也就根本不需要知道對(duì)象是在哪臺(tái)機(jī)器上。例如,你在VB 6中通過DCOM調(diào)用一個(gè)遠(yuǎn)程對(duì)象,你的代碼看起來就與調(diào)用本地對(duì)象一樣。而消息傳遞則不同,它強(qiáng)調(diào)傳遞的東西是什么,但不管消息傳遞過去后干什么??蛻舨恍枰婪?wù)器是怎么實(shí)現(xiàn)的,以及消息是怎么被處理的。 我們已經(jīng)說過,你可以建立一個(gè)消息服務(wù)器,根據(jù)收到的消息來調(diào)用對(duì)象。這是通過消息傳遞方式有效的實(shí)現(xiàn)了RPC。如果客戶仍然以消息的思維方式來進(jìn)行操作,那么你可以把它叫做消息傳遞。但如果客戶以遠(yuǎn)程對(duì)象的思維方式來進(jìn)行操作,那么你就應(yīng)該把它叫做RPC。 如果你想實(shí)現(xiàn)一個(gè)基于XML的消息傳遞系統(tǒng),大量的工作將集中在處理XML請(qǐng)求和應(yīng)答消息上。雖然VB 6和VB.NET中,幫助你建立Web Service的工具已經(jīng)做了許多對(duì)XML消息進(jìn)行處理的工作,但畢竟所有的數(shù)據(jù)都是用XML的形式收發(fā)的,許多情況下你還是需要對(duì)消息進(jìn)行一些自己的處理。深入理解XML和XML Schema對(duì)于有效地實(shí)現(xiàn)XML消息系統(tǒng)是至關(guān)重要的。 建立Web Service 我知道你現(xiàn)在已經(jīng)很心急的想要寫點(diǎn)代碼,看看Web service到底是什么樣的了。那么我們現(xiàn)在就介紹怎樣用VB 6和VB.NET實(shí)際做出一個(gè)Web service來。本節(jié)的目的只是向你展示一下這些工具的功能,而不是深入地講解Web service的工作原理。本書后面的章節(jié)會(huì)向你慢慢說明Web service以及Microsoft SOAP Toolkit和.NET等工具的內(nèi)部原理的。 使用SOAP Toolkit Microsoft的SOAP Toolkit V2幫助你把COM組件變成Web service。這套工具分為三大主要部分:SoapClient是一個(gè)用于調(diào)用Web service的COM組件;SoapServer 是一個(gè)處理SOAP請(qǐng)求和返回SOAP應(yīng)答的組件;還有一個(gè)WSDL向?qū)?,它可以把你的type library轉(zhuǎn)換成WSDL文檔,以暴露給Web service的客戶。 假設(shè)你有一個(gè)COM組件,暴露出一個(gè)GetTemperature方法: Public Function GetTemperature(ByVal zipcode As String, _ ByVal celsius As Boolean) As Single 要把這個(gè)組件變成一個(gè)Web service,你可以使用WSDL向?qū)?。給出你要轉(zhuǎn)換的組件后,向?qū)?huì)要你選擇你想暴露出的方法,指出生成的Web service所在的URL(如http://localhost/Temperature/),以及你希望用ASP還是ISAPI做你的請(qǐng)求處理器(如圖1-2)。然后向?qū)н€會(huì)問你生成的WSDL和ASP文件應(yīng)該放在那個(gè)目錄下。 現(xiàn)在該調(diào)用這個(gè)Web service了。方法是在VB或其他任何可以使用COM的語(yǔ)言里調(diào)用SoapClient組件。下面這段代碼演示了怎樣調(diào)用Webservice中的GetTemperature方法:
首先調(diào)用mssoapinit,把WSDL文檔的URL傳給SoapClient。WSDL文檔的URL就是你在WSDL向?qū)е薪o出的URL加上〈Service名字.wsdl〉。一旦初始化完成,SoapClient就得到了Web service的所有方法,你就可以直接調(diào)用這些方法了。 (責(zé)任編輯 尤北 lvye@staff.) |
|