明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

使用 SOAP Toolkit 2.0 將現(xiàn)有代碼作為 Web 服務提供

[摘要]使用 SOAP Toolkit 2.0 將現(xiàn)有代碼作為 Web 服務提供 使用 .NET 建立分布式應用程序 Steve Kirk 和 Priya DhawanMicrosoft Developer...
使用 SOAP Toolkit 2.0 將現(xiàn)有代碼作為 Web 服務提供
使用 .NET 建立分布式應用程序
Steve Kirk 和 Priya Dhawan
Microsoft Developer Network

摘要:本文介紹了使用 Microsoft SOAP Toolkit 版本 2.0 將現(xiàn)有 Microsoft Visual Basic 6.0 代碼作為 Web 服務提供時所進行的數(shù)據(jù)轉換。

目錄
簡介
現(xiàn)有代碼提供的數(shù)據(jù)類型
ADO 2x Command 對象
ADO 2x Recordset 對象
Stream 對象
XMLDOM 對象
總結

簡介
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ù)大小、如何表示已經成功、如何返回錯誤信息、安全模型(包括訪問控制、身份驗證和加密)、執(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)有代碼經常會提供 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í)行,等等。