明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

使用 .NET 框架將現(xiàn)有代碼作為 Web 服務(wù)提供

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

摘要:本文介紹了使用 ASP.NET 將現(xiàn)有 Microsoft Visual Basic 6.0 代碼作為 Web 服務(wù)提供時所進(jìn)行的數(shù)據(jù)轉(zhuǎn)換。適用于 Microsoft .NET SDK 和 Microsoft Visual Studio.NET 的 Beta 1 版。

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

簡介
.NET 框架簡化了將 .NET 代碼作為 Web 服務(wù)提供的任務(wù)。.NET 框架開發(fā)人員指南中的 ASP.NET Web 服務(wù)和 ASP.NET Web 服務(wù)客戶機(jī)(英文)對此進(jìn)行了說明。之所以能夠?qū)崿F(xiàn)這種簡化,其中一個原因是 .NET 框架提供了一系列規(guī)則,用于將復(fù)雜的 .NET 數(shù)據(jù)類型轉(zhuǎn)換為 XML(序列化)以及反向轉(zhuǎn)換(反序列化)。

編寫為 .NET 之前的類的現(xiàn)有代碼通過特定于語言的數(shù)據(jù)類型或 COM 對象來傳遞數(shù)據(jù),因此不能依賴于相同的標(biāo)準(zhǔn)規(guī)則將這些數(shù)據(jù)類型序列化為 XML。本文介紹了將現(xiàn)有 Microsoft® Visual Basic 6.0 代碼作為 ASP.NET Web 服務(wù)提供時所需的數(shù)據(jù)轉(zhuǎn)換。

評估現(xiàn)有代碼是否適合于作為 Web 服務(wù)提供時,本文討論的數(shù)據(jù)轉(zhuǎn)換問題并不是唯一需要考慮的問題。應(yīng)考慮的其它因素包括對象和狀態(tài)模型、返回的數(shù)據(jù)大小、如何表示已經(jīng)成功、如何返回錯誤信息、安全模型(包括訪問控制、身份驗(yàn)證和加密)、執(zhí)行模型(同步或異步)、如何分發(fā)代碼,以及事務(wù)模型(COM+ 事務(wù)或聲明型事務(wù)),等等。這些問題將在即將發(fā)表的體系結(jié)構(gòu)主題(英文)文章中進(jìn)行討論。

現(xiàn)有代碼提供的數(shù)據(jù)類型
討論現(xiàn)有代碼傳遞的所有數(shù)據(jù)類型的轉(zhuǎn)換將是一個相當(dāng)大的工程,因此本文只介紹一些最常用的數(shù)據(jù)類型,以及 XML(作為字符串),因?yàn)槿绻褂?XML 對現(xiàn)有代碼進(jìn)行擴(kuò)展,那么 XML 就可以涵蓋幾乎所有其它的數(shù)據(jù)類型。本文討論以下數(shù)據(jù)類型的轉(zhuǎn)換方法:

ADO 2x Command 對象
ADO2x Recordset 對象
Stream 對象
XMLDOM 對象
XML
ADO 2x Command 對象
直接訪問數(shù)據(jù)庫的現(xiàn)有代碼經(jīng)常會提供 Microsoft ActiveX® 數(shù)據(jù)對象 (ADO) 的 Command 對象。雖然不能在運(yùn)行于不同進(jìn)程中的應(yīng)用程序?qū)又g傳遞 Command 對象,但可以在同一進(jìn)程內(nèi)傳遞該對象。對于單行數(shù)據(jù)實(shí)體,通過 Command 對象的輸出參數(shù)返回?cái)?shù)據(jù)比通過 ADO 記錄集返回?cái)?shù)據(jù)效率更高。因此,ADO Command 對象對于返回單行實(shí)體數(shù)據(jù)十分有用。

讀數(shù)據(jù)
以下示例中的現(xiàn)有代碼返回一個 ADO Command 對象,它包含作為輸出參數(shù)的數(shù)據(jù)。Command 對象的 Parameters 集合轉(zhuǎn)換為 XML 并返回給 Web 服務(wù)的客戶:

' 現(xiàn)有代碼返回 ADO Command 對象
Cmd = CType(EC.Example1(), ADODB.Command)
' 使用 XmlTextWriter 和 StringWriter 轉(zhuǎn)換 Command 對象的 Parameters 集合
' 初始化 stringwriter 和 xmlwriter 以返回 xml 字符串
strWriter = New StringWriter()
xmlWriter = New XmlTextWriter(strWriter)
' 在 Parameters 集合內(nèi)循環(huán),寫入名稱和值
For i = 0 To Cmd.Parameters.Count - 1
xmlwriter.WriteElementString(Cmd.Parameters(i).Name.Substring(1),_
Cmd.Parameters(i).Value.ToString)
Next
' 將 xml 作為字符串返回
Example1 = strWriter.GetStringBuilder.ToString()
寫數(shù)據(jù)
將數(shù)據(jù)作為 Command 對象的參數(shù)傳遞是一種非常有效的數(shù)據(jù)傳遞方法。它還可以進(jìn)行擴(kuò)展,并提供了一些類型檢查功能。不幸的是,由于 Beta 1 中存在缺陷,Command 對象產(chǎn)生的數(shù)據(jù)無法傳遞到現(xiàn)有代碼。Beta 2 中解決了這個問題。Beta 1 的解決方法是對現(xiàn)有的 VB 6 代碼進(jìn)行擴(kuò)展,接受 XML。

ADO2x Recordset 對象
ADO 2x 斷開連接的記錄集通常用于在多層應(yīng)用程序的各層之間傳遞數(shù)據(jù)。數(shù)據(jù)可以是單行、多行或分層次的行。

讀數(shù)據(jù)
本示例中,現(xiàn)有代碼返回一個 ADO Recordset 對象,它包含的層次行數(shù)據(jù)將被轉(zhuǎn)換為 XML,然后由 Web 服務(wù)返回:

' 現(xiàn)有代碼返回記錄集
RS = CType(EC.Example3(), ADODB.Recordset)
' 實(shí)例化一個接收記錄集數(shù)據(jù)的流
Stream = New ADODB.Stream()
' 將記錄集的 XML 表示寫入流
RS.Save(Stream, ADODB.PersistFormatEnum.adPersistXML)
' 將 XML 作為字符串從流返回
Example3 = Stream.ReadText
寫數(shù)據(jù)
以下示例中,使用表示層次行數(shù)據(jù)的 XML 填充 ADO Recordset 對象,該對象將被傳遞到現(xiàn)有代碼:

' 實(shí)例化一個記錄集對象
RS = New ADODB.Recordset()
' 實(shí)例化一個流對象
Stream = New ADODB.Stream()
' 打開流對象
Stream.Open()
' 將 XML 寫入流
Stream.WriteText(RsXML)
' 將指針定位到流的開頭
Stream.Position = 0
' 使用流中的 XML 數(shù)據(jù)打開記錄集
RS.Open(Stream)
' 將記錄集傳遞到現(xiàn)有代碼
EC.Example4(RS)
Stream 對象
流提供了一種在應(yīng)用程序的本地層之間傳遞數(shù)據(jù)的有效方法。它是從 Microsoft SQL Server™2000 中讀取 XML 的主要方法。

讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回表示層次行數(shù)據(jù)的 XML 流,它被作為字符串讀取,并由 Web 服務(wù)返回:

Dim Stream As ADODB.Stream
Stream = CType(EC.Example5(), adodb.stream)
Example5 = Stream.ReadText
XMLDOM 對象
XMLDOM 對象是一種在多層應(yīng)用程序的本地層之間傳遞數(shù)據(jù)的好方法。它提供了接口可擴(kuò)展性、類型檢查和架構(gòu)驗(yàn)證功能。

讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回一個 XML 文檔對象模型 (XMLDOM),它被轉(zhuǎn)換為 XML 字符串并由 Web 服務(wù)返回:

Dim Doc As MSXML2.DOMDocument
' 現(xiàn)有代碼返回 XMLDOM 對象
Doc = CType(EC.Example6(), msxml2.DOMDocument)
' 從 DOM 對象返回 XML
Example6 = Doc.xml
寫數(shù)據(jù)
以下示例中,使用表示層次行數(shù)據(jù)的 XML 填充 XMLDOM 對象,并將該對象傳遞到現(xiàn)有代碼:

Dim Doc As MSXML2.DOMDocument
' 實(shí)例化一個 XMLDOMDocument 對象
Doc = New MSXML2.DOMDocument()
' 將 XML 載入 DOM
Doc.loadXML(orderXML)
' 將 DOM 傳遞到現(xiàn)有代碼
EC.Example7(Doc)
XML 字符串
XML 是一種在層與層之間傳遞數(shù)據(jù)的簡單方法。它還將數(shù)據(jù)的 XML 轉(zhuǎn)換過程推到 COM 互操作邊界的“現(xiàn)有代碼”端,根據(jù)接口的不同,這可能會比在 COM 互操作邊界將數(shù)據(jù)轉(zhuǎn)換為 XML 更有效。

讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回一個包含 XML 數(shù)據(jù)的字符串,然后,該字符串由 Web 服務(wù)傳遞給客戶:

EC = New ExCode.ExClass()
' 將 XML 字符串直接從現(xiàn)有代碼傳遞給客戶
Example8 = EC.Example8()
寫數(shù)據(jù)
以下示例中,層次行數(shù)據(jù)的 XML 表示作為字符串傳遞到現(xiàn)有代碼:

EC = New ExCode.ExClass()
' 將 XML 字符串直接從客戶傳遞到現(xiàn)有代碼
EC.Example9(orderXML)

總結(jié)
本文及附帶的示例介紹了有關(guān)數(shù)據(jù)轉(zhuǎn)換的信息。通過數(shù)據(jù)轉(zhuǎn)換,可以使用 ASP.NET 將現(xiàn)有代碼作為 Web 服務(wù)提供。本文討論了一些常用的接口對象,其中包括 XML 字符串,如果使用相應(yīng)的接口對現(xiàn)有代碼進(jìn)行擴(kuò)展,它可以涵蓋大多數(shù)數(shù)據(jù)。

這些解決方案的性能各異,并且受所傳遞的數(shù)據(jù)大小影響。在本系列后面的文章中,我們將對這些實(shí)現(xiàn)方法進(jìn)行比較。

評估現(xiàn)有代碼是否適合作為 Web 服務(wù)時,接口只不過是應(yīng)當(dāng)考慮的諸多因素之一。應(yīng)考慮的其它因素包括安全性(包括授權(quán)、身份驗(yàn)證和加密)、事務(wù)模型、狀態(tài)模型、返回錯誤和結(jié)果的方式,以及代碼是同步還是異步執(zhí)行,等等。