簡(jiǎn)介
Microsoft?SOAP Toolkit 版本 2.0 簡(jiǎn)化了將現(xiàn)有代碼作為 Web 服務(wù)提供和使用的任務(wù),MSDN Library 的 SDK 部分中的 SOAP Toolkit 2.0 文檔(英文)對(duì)此進(jìn)行了說明。在服務(wù)器端執(zhí)行的一些主要功能是,在現(xiàn)有代碼傳遞的不同數(shù)據(jù)類型的數(shù)據(jù)和 XML 消息(在 Web 服務(wù)客戶機(jī)和服務(wù)器之間使用)之間進(jìn)行轉(zhuǎn)換。簡(jiǎn)單數(shù)據(jù)類型的轉(zhuǎn)換可以自動(dòng)處理,較為復(fù)雜的數(shù)據(jù)類型則需要開發(fā)人員提供轉(zhuǎn)換代碼。
評(píng)估現(xiàn)有代碼是否適合于作為 Web 服務(wù)提供時(shí),本文討論的數(shù)據(jù)轉(zhuǎn)換問題并不是唯一需要考慮的問題。應(yīng)考慮的其它因素包括對(duì)象和狀態(tài)模型、返回的數(shù)據(jù)大小、如何表示已經(jīng)成功、如何返回錯(cuò)誤信息、安全模型(包括訪問控制、身份驗(yàn)證和加密)、執(zhí)行模型(同步或異步)、如何分發(fā)代碼,以及事務(wù)模型(COM+ 事務(wù)或聲明型事務(wù)),等等。這些問題將在即將發(fā)表的體系結(jié)構(gòu)主題(英文)文章中進(jìn)行討論。
現(xiàn)有代碼提供的數(shù)據(jù)類型
要介紹現(xiàn)有代碼傳遞的所有數(shù)據(jù)類型的轉(zhuǎn)換是一個(gè)相當(dāng)大的工程,因此本文介紹了某些最常用的數(shù)據(jù)類型。通過 SOAP Toolkit 代碼進(jìn)行轉(zhuǎn)換的一個(gè)替代方案是使用 XML 接口對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展。本文討論了以下數(shù)據(jù)類型的轉(zhuǎn)換方法:
- ADO 2x Command 對(duì)象
- ADO2x Recordset 對(duì)象
- Stream 對(duì)象
- XMLDOM 對(duì)象
ADO 2x Command 對(duì)象
直接訪問數(shù)據(jù)庫的現(xiàn)有代碼經(jīng)常會(huì)提供 Microsoft ActiveX? 數(shù)據(jù)對(duì)象 (ADO) 的 Command 對(duì)象。雖然不能在運(yùn)行于不同進(jìn)程中的應(yīng)用程序?qū)又g傳遞 Command 對(duì)象,但可以在同一進(jìn)程內(nèi)傳遞該對(duì)象。對(duì)于單行數(shù)據(jù)實(shí)體,通過 Command 對(duì)象的輸出參數(shù)返回?cái)?shù)據(jù)比通過 ADO 記錄集返回?cái)?shù)據(jù)效率更高。因此,ADO Command 對(duì)象對(duì)于返回單行實(shí)體數(shù)據(jù)十分有用。
讀數(shù)據(jù)
以下示例中的現(xiàn)有代碼返回一個(gè) ADO Command 對(duì)象,它包含作為輸出參數(shù)的數(shù)據(jù)。在傳遞給 Web 服務(wù)的客戶之前,Custom Type Mapper 中的代碼使用 SoapSerializer 對(duì)象對(duì) Command 對(duì)象進(jìn)行轉(zhuǎn)換:
With SoapSerializer
`轉(zhuǎn)換 CommandType
.startElement "CommandType"
.writeString Cmd.CommandType
.endElement
`轉(zhuǎn)換 CommandText
.startElement "CommandText"
cmdText = Cmd.CommandText
cmdText = Left(Cmd.CommandText, Len(cmdText) - 8)
cmdText = Right(cmdText, Len(cmdText) - 7)
.writeString cmdText
.endElement
`轉(zhuǎn)換 Parameters 集合
.startElement "Parameters"
For i = 0 To oCmd.Parameters.Count - 1
.startElement Right(oCmd.Parameters(i).Name, _
Len(oCmd.Parameters(i).Name) - 1)
.startElement "Direction"
.writeString oCmd.Parameters(i).Direction
.endElement
.startElement "Type"
.writeString oCmd.Parameters(i).Type
.endElement
.startElement "Size"
.writeString oCmd.Parameters(i).Size
.endElement
.startElement "Value"
.writeString oCmd.Parameters(i).Value
.endElement
.endElement
Next
.endElement
End With寫數(shù)據(jù)
將數(shù)據(jù)作為 Command 對(duì)象的參數(shù)傳遞是一種非常有效的數(shù)據(jù)傳遞方法。它還可以進(jìn)行擴(kuò)展,并提供了一些類型檢查功能。
以下示例中,客戶提交給 Web 服務(wù)的 XML 數(shù)據(jù)被轉(zhuǎn)換為 ADO Command 對(duì)象的參數(shù),它將被傳遞到現(xiàn)有代碼:
Dim Cmd As ADODB.Command
Dim Param As ADODB.Parameter
' pNode 是包含客戶提交的 XML 的 MSXML2.IXMLDOMNode
' 實(shí)例化一個(gè) ADO Command 對(duì)象
Set Cmd = New ADODB.Command
With Cmd
' 應(yīng)用 CommandType 和 CommandText
.CommandType = _
CInt(pNode.selectSingleNode("CommandType").nodeTypedValue)
.CommandText = pNode.selectSingleNode("CommandText").nodeTypedValue
' 填充 Parameters 集合
Set nodeParent = pNode.selectSingleNode("Parameters")
For i = 0 To nodeParent.childNodes.length - 1
Set nodeParameter = nodeParent.childNodes(i)
Set Param = New ADODB.Parameter
With Param
.Name = "@" + nodeParameter.nodeName
.Direction = _
nodeParameter.selectSingleNode("Direction").nodeTypedValue
.Type = nodeParameter.selectSingleNode("Type").nodeTypedValue
.Size = nodeParameter.selectSingleNode("Size").nodeTypedValue
.Value = factory.getMapper(enXSDstring, _
Nothing).Read(nodeParameter.selectSingleNode("Value"), _
bstrEncoding, encodingMode, lFlags)
End With
.Parameters.Append oParam
Next
End With
ADO 2x Recordset 對(duì)象
ADO 2x 斷開連接的記錄集通常用于在多層應(yīng)用程序的各層之間傳遞數(shù)據(jù)。數(shù)據(jù)可以是單行、多行或分層次的行。
讀數(shù)據(jù)
本示例中,現(xiàn)有代碼返回一個(gè) ADO Recordset 對(duì)象,它包含的層次行數(shù)據(jù)將被轉(zhuǎn)換為 XML,然后再返回給客戶:
Dim Doc As MSXML2.DOMDocument
Set Doc = New MSXML2.DOMDocument
' 將記錄集數(shù)據(jù)寫入 XMLDOM
rs.Save oDoc, adPersistXML
' 將 XML 傳遞到 SOAP Toolkit Serializer
SoapSerializer.writeXML Doc.xml
寫數(shù)據(jù)
以下示例中,使用表示層次行數(shù)據(jù)的 XML 填充 ADO Recordset 對(duì)象,該對(duì)象將被傳遞到現(xiàn)有代碼:
Dim rs As ADODB.Recordset
Dim Doc As MSXML2.DOMDocument
Set rs = New ADODB.Recordset
Set Doc = New MSXML2.DOMDocument
' 將 XML 載入 XMLDOMDocument
Doc.loadXML pNode.xml
' 使用來自 XMLDOMDocument 的 XML 填充記錄集
rs.Open Doc
Stream 對(duì)象
流提供了一種在應(yīng)用程序的本地層之間傳遞數(shù)據(jù)的有效方法。它是從 Microsoft SQL Server?2000 中讀取 XML 的主要方法。
讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回表示層次行數(shù)據(jù)的 XML 流,它將被轉(zhuǎn)換,然后返回給客戶:
Dim inStream As ADODB.Stream
' pvar 包含現(xiàn)有代碼返回的流對(duì)象
Set inStream = pvar
' 將 XML 數(shù)據(jù)從流傳遞到 SOAP Serializer
SoapSerializer.writeString inStream.ReadText
XMLDOM 對(duì)象
XMLDOM 對(duì)象是一種在多層應(yīng)用程序的本地層之間傳遞數(shù)據(jù)的好方法。它提供了接口可擴(kuò)展性、類型檢查和架構(gòu)驗(yàn)證功能。
讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回一個(gè) XMLDOMDocument 對(duì)象,該對(duì)象將被轉(zhuǎn)換,然后返回給客戶:
`pvar 包含 XMLDOMDocument
pSoapSerializer.writeXML pvar.xml
寫數(shù)據(jù)
以下示例中,使用表示層次行數(shù)據(jù)(由客戶提交)的 XML 填充 XMLDOM 對(duì)象,然后將該對(duì)象傳遞到現(xiàn)有代碼:
Set oDoc = New MSXML2.DOMDocument
' 將 IXMLDOMNode XML 載入 DOMDocument 對(duì)象
`pnode 包含 IXMLDOMNode 對(duì)象
oDoc.loadXML pNode.childNodes(0).xml
總結(jié)
本文及附帶的示例介紹了有關(guān)數(shù)據(jù)轉(zhuǎn)換的信息。通過數(shù)據(jù)轉(zhuǎn)換,可以使用 SOAP Toolkit 2.0 將現(xiàn)有代碼作為 Web 服務(wù)提供。本文介紹了一些常用的接口對(duì)象。
這些解決方案的性能各異,并且受所傳遞的數(shù)據(jù)大小影響。在本系列后面的文章中,我們將對(duì)這些實(shí)現(xiàn)方法進(jìn)行比較。
評(píng)估現(xiàn)有代碼是否適合作為 Web 服務(wù)時(shí),接口只不過是應(yīng)當(dāng)考慮的諸多因素之一。應(yīng)考慮的其它因素包括安全性(包括授權(quán)、身份驗(yàn)證和加密)、事務(wù)模型、狀態(tài)模型、返回錯(cuò)誤和結(jié)果的方式,以及代碼是同步還是異步執(zhí)行,等等。