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