為Microsoft .NET做好準備
本文介紹了.NET、WebServices(Web服務(wù))和SOAP(簡(jiǎn)單對象訪(fǎng)問(wèn)協(xié)議),并且對一個(gè)調用了簡(jiǎn)單WebServices的源代碼示例進(jìn)行討論。
本文引用地址:http://dyxdggzs.com/article/149156.htm需要具備
Microsoft®eMbeddedVisualTools
PocketPC上的有效Internet連接
如果需要,您可以下載本文中的示例代碼。
須知
SOAP規范(當前版本為1.1)仍然是一個(gè)處于提議狀態(tài)的標準并且有可能發(fā)生變化。在SOAP規范發(fā)生修改和變化時(shí),本文中所提供的示例代碼可能需要修改。
該示例代碼使用了SDL(ServicesDescriptionLanguage,服務(wù)描述語(yǔ)言)來(lái)定義WebServices,而SDL即將(有望在2001年的上半年)被最新的WSDL規范(WebServicesDescriptionLanguage,Web服務(wù)描述語(yǔ)言)所替代。本文中所提供的示例代碼不能同使用WSDL規范的WebServices配合工作。
支持的語(yǔ)言
英語(yǔ)
Microsoft.NET、WebServices和SOAP
Microsoft.NET構想的一個(gè)核心部分便是實(shí)現程序間的普遍集成。這意味著(zhù)必須使駐留在不同平臺上的各種應用程序都可以調用以WebServices形式實(shí)現的功能和服務(wù)。本質(zhì)上說(shuō),你可以使用WebServices來(lái)開(kāi)發(fā)可通過(guò)HTTP(HypertextTransferProtocol,超文本傳輸協(xié)議)進(jìn)行使用的組件方法,并且使用XML(ExtensibleMarkupLanguage,擴展標記語(yǔ)言)對通信數據進(jìn)行格式化。而完成這一切工作所使用的標準便是SOAP,SOAP當前正在由W3C進(jìn)行標準化工作。(請通過(guò)本文末尾的鏈接部分了解更多信息)
WebServices將改變我們設計應用程序的方式,因為我們可以將位于Internet各個(gè)角落的功能集成到一個(gè)單一的定制化程序當中。顯然,Web應用程序很適合使用這種程序設計方式。但是客戶(hù)端程序也可以使用這種方式得以實(shí)現,這使得豐富的用戶(hù)界面同廣泛的分布式服務(wù)可以完美結合在一起。對于MicrosoftWindows®PoweredPocketPC來(lái)說(shuō),這也是一種完美的手段,因為它具有強大的用戶(hù)界面和熟悉的編程平臺,而且同臺式機相比,它具有相對較低的資源占用量(內存等等)。因為SOAP協(xié)議相當小巧,如果您想為設備添加無(wú)線(xiàn)訪(fǎng)問(wèn)功能,您可以通過(guò)無(wú)處不在的功能和服務(wù)實(shí)現強大的解決方案,從而對現有系統進(jìn)行極大擴展。“集成點(diǎn)”式的Web服務(wù)器離您正在越來(lái)越近。它就在那里,在您的手上!
如何調用WebServices
在您的桌面PC上,您首先應該下載SOAPToolkit,然后您可以使用ROPE(RemoteObjectProxyEngine,遠程對象代理引擎)從任何語(yǔ)言中調用WebServices。ROPE是一個(gè)DLL(動(dòng)態(tài)鏈接庫),它提供了Web服務(wù)開(kāi)發(fā)所需的核心功能和基礎結構,并且使您可以使用熟悉的編程方式實(shí)現Web服務(wù)。它允許客戶(hù)端訪(fǎng)問(wèn)某個(gè)WebService,只要該客戶(hù)端是一個(gè)本地COM對象即可。但是,在PocketPC上,現在還沒(méi)有任何可用的ROPE實(shí)現。我說(shuō)“現在還沒(méi)有”是因為我相信:未來(lái)必將出現可在PocketPC上使用的WebServices(SOAP)和其它一些.NET部件。
同時(shí),您可以使用我提供的簡(jiǎn)化ROPE實(shí)現,它是本文示例代碼的一部分,通過(guò)它,您現在就可以在您的PocketPC上開(kāi)始使用WebServices。
WebServices能做什么?
在我們開(kāi)始討論代碼之前,讓我們首先探討一下WebServices究竟能為我們做些什么。在下面這個(gè)窗體中,我從SOAPToolkit中復制了一個(gè)示例客戶(hù)端程序,并將其作為一個(gè)MicrosofteMbeddedVisualBasic®應用程序。

圖1:PocketPC上的示例ROPE客戶(hù)端程序。
通過(guò)這個(gè)客戶(hù)程序,您可以使用Microsoft在SOAPToolkit中提供的WebService示例從Internet上實(shí)時(shí)獲知股票價(jià)格。您還可以從托管這些服務(wù)的服務(wù)器上得到當前時(shí)間,以及由美國海軍天文臺提供的UTC(CoordinatedUniversalTime)時(shí)間。最后,您還可以方便地使用一個(gè)向公眾開(kāi)放的翻譯服務(wù)(就在您自己的程序內部)。非???!
代碼研究
以下是btnGetStockQuote_Click事件的代碼(在按下最頂端的“Get”按鈕時(shí)執行):
DimlavParameters(2)AsVariant
DimlsAsString
'Setparameters
lavParameters(1)=txtSymbol.Text
lavParameters(2)=anycompany
'MakeSOAPcall
ls=SOAPCall(txtURI.Text,GetStockQuote,lavParameters,
chkShowPackets.Value=1)
'Showresult
MsgBoxShareprice=ls
代碼說(shuō)明:
因為eMbeddedVisualBasic的功能參數中缺少ParamArray選項,我們必須手動(dòng)將該參數添加到Variant數組中。
SOAPCall函數使用了4個(gè)參數:
Web地址,指向WebServices描述文件(SDL)的URI(UniversalResourceIdentifier,通用資源標示符)。
調用的方法名。
方法使用的參數。
一個(gè)真/假標志,指出在調用期間()是否顯示XML負載(已發(fā)送和已接受),在本示例代碼中我們在窗體中使用了一個(gè)復選框(CheckBox)。
因為SOAPCall函數是在ROPE.bas模塊中實(shí)現的,對WebServices的調用過(guò)程非常簡(jiǎn)單。
讓我們更深入地看一看ROPE.bas模塊。以下是一些進(jìn)行實(shí)際SOAP調用的代碼(節選自SOAPCall函數):
'SetPayload
lsRequest=lsRequestvbCrLf
lsRequest=lsRequest
/envelope/SOAP:encodingStyle=http://schemas.xmlsoap.org/soap
/encoding/>vbCrLf
lsRequest=lsRequest
lsRequest=lsRequestMethod>vbCrLf
lsParameterOrder=GetParameterOrder(psServicesDescription,Method)
IflsParameterOrder>Then
lasParameterOrder=Split(lsParameterOrder,)
Fori=0ToUBound(lasParameterOrder)
lsRequest=lsRequestlasParameterOrder(i)>CStr(Arguments(i+1))
vbCrLf
Nexti
EndIf
lsRequest=lsRequestvbCrLf
lsRequest=lsRequest
lsRequest=lsRequest
'GetListener
lsListener=GetListener(psServicesDescription)
'CreateXMLHTTPobject
SetloXMLHTTP=CreateObject(Microsoft.XMLHTTP)
'OpenURLtoListener
loXMLHTTP.OpenPOST,lsListener,False,,
'Setheaderinfo
loXMLHTTP.setRequestHeaderSOAPAction,Method
loXMLHTTP.setRequestHeaderContent-Type,text/xml
'MakerequesttoSOAPservice/method
loXMLHTTP.SendlsRequest
'IfOK,getresponse
IfLen(loXMLHTTP.ResponseXML.XML)>0Then
lsResponse=loXMLHTTP.ResponseXML.XML
SOAPCall=GetReturnValue(lsResponse,Method)
Else
MsgBoxloXMLHTTP.ResponseText
EndIf
代碼說(shuō)明:
lsRequest變量被實(shí)際的請求負載(使用XML格式)所填充。除了方法名和參數值以外,內容主要是硬編碼的XML文本。GetParameterOrder函數抽取出了參數和它們各自的順序,以便以正確的順序接收各個(gè)參數。
GetListener函數可以取出Web地址,也就是URL(UniversalResourceLocator,通用資源定位符),來(lái)“偵聽(tīng)”WebService。偵聽(tīng)程序是一個(gè)Web頁(yè)面,請求將被發(fā)送到這個(gè)頁(yè)面上,該頁(yè)面使用服務(wù)描述語(yǔ)言定義。它通常上是一個(gè)ASP(ActiveServerPages)頁(yè)面,但是使用一個(gè)更有效的ISAPI(InternetServerApplicationProgrammingInterface,Internet服務(wù)器應用程序編程接口)。
我目前正在使用XMLHTTP進(jìn)行實(shí)際調用,您可以在所有PocketPC上找到該組件。
GetReturnValue函數負責從響應負載(XML格式)中取出返回值。如果發(fā)生錯誤,返回值為錯誤代碼。
雖然沒(méi)有在上面的代碼中顯示,但大多數子函數都使用XMLDOM組件(可在所有PocketPC上找到該組件)分析響應XML字符串。而且即便是ROPE.bas模塊沒(méi)有實(shí)現所有SOAPToolki所能夠實(shí)現的所有ROPE功能,但它提供了最重要的大部分功能--足以使您調用WebServices。
如果您希望了解更多詳細信息,我建議您認真閱讀完整的示例代碼。
運行服務(wù)
好了,我已經(jīng)完成了使WebServices開(kāi)始工作所需的一些基礎工作?,F在,要由您來(lái)完成最有意思的部分:創(chuàng )建一個(gè)使用WebServices的出色程序。目前,Internet上還沒(méi)有太多的WebServices供我們使用,所以您必須自己實(shí)現一些服務(wù)。但是,我知道Microsoft提供了一個(gè)叫做TerraService的WebServices,它可以將動(dòng)態(tài)地圖發(fā)送到您的應用程序之中。此外,您開(kāi)可以在網(wǎng)上找到一個(gè)利用VisualStudio.NETBeta1創(chuàng )建的示例程序。
如果您想對新出現的WebServices保持跟蹤,請訪(fǎng)問(wèn)MicrosoftUDDI(UniversalDescription,DiscoveryandIntegration)站點(diǎn)。UDDI的目標是創(chuàng )建一個(gè)全球化的WebServices存儲庫,您可以使用它查找所需的功能和服務(wù)--甚至是來(lái)自某個(gè)應用程序的實(shí)時(shí)服務(wù),包括Microsoft、IBM、Sun、Oracle在內的主要廠(chǎng)商和其它100多家廠(chǎng)商都支持UDDI。
如果您決定在Internet上發(fā)布某個(gè)Web服務(wù),請及時(shí)通知我--我想先試試它們!
未來(lái)會(huì )怎樣
我相信在不遠的將來(lái),所有的.NET特性都將在PocketPC上得以實(shí)現。隨后,對WebServices的支持將集成到操作系統和開(kāi)發(fā)工具之中。調用WebServices將像調用本地組件那樣容易,大多數應用程序將通過(guò)集成多個(gè)服務(wù)進(jìn)行構建。第一次WebServices浪潮預計將出現在公司內部,企業(yè)將來(lái)自多個(gè)系統的服務(wù)集成到一個(gè)應用程序之中,隨后的發(fā)展趨勢則是通過(guò)Internet將來(lái)自多個(gè)服務(wù)提供商的多個(gè)服務(wù)完全集成在一起。
相關(guān)鏈接
如果您想了解同.NET有關(guān)的更多信息,請訪(fǎng)問(wèn)Microsoft.NET頁(yè)面。
如果您想了解同SOAP有關(guān)的更多信息,請訪(fǎng)問(wèn)MSDNSOAP開(kāi)發(fā)資源頁(yè)面。
如果您想了解同ROPE有關(guān)的更多信息,請訪(fǎng)問(wèn)MSDNMagazine文章“WebService開(kāi)發(fā):立即上手使用SOAPToolkitforVisualStudio”。
如果您想同PC上的代碼示例進(jìn)行對比,請下載SOAPToolkit(SOAPToolkitforMicrosoftVisualStudio®V6.0)。
小結
對于利用分布式Web服務(wù)的強大功能來(lái)說(shuō),具有纖細外形的PocketPC可以說(shuō)是上佳之選。您現在不僅可以瀏覽Web內容,而且可以充分利用Web所具有的強大能量(功能),您甚至可以使用無(wú)線(xiàn)方式做到這一切。
我希望,您能像我一樣為這一切感到萬(wàn)分激動(dòng),因為它將實(shí)質(zhì)性地改變我們的系統集成方式。當各種出色的WebServices如雨后春筍般涌現出來(lái)之時(shí),您就可以在任何地方輕而易舉地利用這些服務(wù)。
希望能有更多的開(kāi)發(fā)人員就此問(wèn)題在PocketPC.com上展開(kāi)討論,因為WebServices是.NET戰略重中之重。
評論