使用 .NET 框架將現(xiàn)有代碼作為 Web 服務(wù)提供
2024-07-10 13:01:42
供稿:網(wǎng)友
使用 .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ù)提供時(shí)所進(jìn)行的數(shù)據(jù)轉(zhuǎn)換。適用于 microsoft .net sdk 和 microsoft visual studio.net 的 beta 1 版。
目錄
簡(jiǎn)介
現(xiàn)有代碼提供的數(shù)據(jù)類(lèi)型
ado 2x command 對(duì)象
ado 2x recordset 對(duì)象
stream 對(duì)象
xmldom 對(duì)象
xml 字符串
總結(jié)
簡(jiǎn)介
.net 框架簡(jiǎn)化了將 .net 代碼作為 web 服務(wù)提供的任務(wù)。.net 框架開(kāi)發(fā)人員指南中的 asp.net web 服務(wù)和 asp.net web 服務(wù)客戶機(jī)(英文)對(duì)此進(jìn)行了說(shuō)明。之所以能夠?qū)崿F(xiàn)這種簡(jiǎn)化,其中一個(gè)原因是 .net 框架提供了一系列規(guī)則,用于將復(fù)雜的 .net 數(shù)據(jù)類(lèi)型轉(zhuǎn)換為 xml(序列化)以及反向轉(zhuǎn)換(反序列化)。
編寫(xiě)為 .net 之前的類(lèi)的現(xiàn)有代碼通過(guò)特定于語(yǔ)言的數(shù)據(jù)類(lèi)型或 com 對(duì)象來(lái)傳遞數(shù)據(jù),因此不能依賴于相同的標(biāo)準(zhǔn)規(guī)則將這些數(shù)據(jù)類(lèi)型序列化為 xml。本文介紹了將現(xiàn)有 microsoft® visual basic 6.0 代碼作為 asp.net web 服務(wù)提供時(shí)所需的數(shù)據(jù)轉(zhuǎn)換。
評(píng)估現(xiàn)有代碼是否適合于作為 web 服務(wù)提供時(shí),本文討論的數(shù)據(jù)轉(zhuǎn)換問(wèn)題并不是唯一需要考慮的問(wèn)題。應(yīng)考慮的其它因素包括對(duì)象和狀態(tài)模型、返回的數(shù)據(jù)大小、如何表示已經(jīng)成功、如何返回錯(cuò)誤信息、安全模型(包括訪問(wèn)控制、身份驗(yàn)證和加密)、執(zhí)行模型(同步或異步)、如何分發(fā)代碼,以及事務(wù)模型(com+ 事務(wù)或聲明型事務(wù)),等等。這些問(wèn)題將在即將發(fā)表的體系結(jié)構(gòu)主題(英文)文章中進(jìn)行討論。
現(xiàn)有代碼提供的數(shù)據(jù)類(lèi)型
討論現(xiàn)有代碼傳遞的所有數(shù)據(jù)類(lèi)型的轉(zhuǎn)換將是一個(gè)相當(dāng)大的工程,因此本文只介紹一些最常用的數(shù)據(jù)類(lèi)型,以及 xml(作為字符串),因?yàn)槿绻褂?xml 對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,那么 xml 就可以涵蓋幾乎所有其它的數(shù)據(jù)類(lèi)型。本文討論以下數(shù)據(jù)類(lèi)型的轉(zhuǎn)換方法:
ado 2x command 對(duì)象
ado2x recordset 對(duì)象
stream 對(duì)象
xmldom 對(duì)象
xml
ado 2x command 對(duì)象
直接訪問(wèn)數(shù)據(jù)庫(kù)的現(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í)體,通過(guò) command 對(duì)象的輸出參數(shù)返回?cái)?shù)據(jù)比通過(guò) ado 記錄集返回?cái)?shù)據(jù)效率更高。因此,ado command 對(duì)象對(duì)于返回單行實(shí)體數(shù)據(jù)十分有用。
讀數(shù)據(jù)
以下示例中的現(xiàn)有代碼返回一個(gè) ado command 對(duì)象,它包含作為輸出參數(shù)的數(shù)據(jù)。command 對(duì)象的 parameters 集合轉(zhuǎn)換為 xml 并返回給 web 服務(wù)的客戶:
' 現(xiàn)有代碼返回 ado command 對(duì)象
cmd = ctype(ec.example1(), adodb.command)
' 使用 xmltextwriter 和 stringwriter 轉(zhuǎn)換 command 對(duì)象的 parameters 集合
' 初始化 stringwriter 和 xmlwriter 以返回 xml 字符串
strwriter = new stringwriter()
xmlwriter = new xmltextwriter(strwriter)
' 在 parameters 集合內(nèi)循環(huán),寫(xiě)入名稱和值
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()
寫(xiě)數(shù)據(jù)
將數(shù)據(jù)作為 command 對(duì)象的參數(shù)傳遞是一種非常有效的數(shù)據(jù)傳遞方法。它還可以進(jìn)行擴(kuò)展,并提供了一些類(lèi)型檢查功能。不幸的是,由于 beta 1 中存在缺陷,command 對(duì)象產(chǎn)生的數(shù)據(jù)無(wú)法傳遞到現(xiàn)有代碼。beta 2 中解決了這個(gè)問(wèn)題。beta 1 的解決方法是對(duì)現(xiàn)有的 vb 6 代碼進(jìn)行擴(kuò)展,接受 xml。
ado2x recordset 對(duì)象
ado 2x 斷開(kāi)連接的記錄集通常用于在多層應(yīng)用程序的各層之間傳遞數(shù)據(jù)。數(shù)據(jù)可以是單行、多行或分層次的行。
讀數(shù)據(jù)
本示例中,現(xiàn)有代碼返回一個(gè) ado recordset 對(duì)象,它包含的層次行數(shù)據(jù)將被轉(zhuǎn)換為 xml,然后由 web 服務(wù)返回:
' 現(xiàn)有代碼返回記錄集
rs = ctype(ec.example3(), adodb.recordset)
' 實(shí)例化一個(gè)接收記錄集數(shù)據(jù)的流
stream = new adodb.stream()
' 將記錄集的 xml 表示寫(xiě)入流
rs.save(stream, adodb.persistformatenum.adpersistxml)
' 將 xml 作為字符串從流返回
example3 = stream.readtext
寫(xiě)數(shù)據(jù)
以下示例中,使用表示層次行數(shù)據(jù)的 xml 填充 ado recordset 對(duì)象,該對(duì)象將被傳遞到現(xiàn)有代碼:
' 實(shí)例化一個(gè)記錄集對(duì)象
rs = new adodb.recordset()
' 實(shí)例化一個(gè)流對(duì)象
stream = new adodb.stream()
' 打開(kāi)流對(duì)象
stream.open()
' 將 xml 寫(xiě)入流
stream.writetext(rsxml)
' 將指針定位到流的開(kāi)頭
stream.position = 0
' 使用流中的 xml 數(shù)據(jù)打開(kāi)記錄集
rs.open(stream)
' 將記錄集傳遞到現(xiàn)有代碼
ec.example4(rs)
stream 對(duì)象
流提供了一種在應(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 對(duì)象
xmldom 對(duì)象是一種在多層應(yīng)用程序的本地層之間傳遞數(shù)據(jù)的好方法。它提供了接口可擴(kuò)展性、類(lèi)型檢查和架構(gòu)驗(yàn)證功能。
讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回一個(gè) xml 文檔對(duì)象模型 (xmldom),它被轉(zhuǎn)換為 xml 字符串并由 web 服務(wù)返回:
dim doc as msxml2.domdocument
' 現(xiàn)有代碼返回 xmldom 對(duì)象
doc = ctype(ec.example6(), msxml2.domdocument)
' 從 dom 對(duì)象返回 xml
example6 = doc.xml
寫(xiě)數(shù)據(jù)
以下示例中,使用表示層次行數(shù)據(jù)的 xml 填充 xmldom 對(duì)象,并將該對(duì)象傳遞到現(xiàn)有代碼:
dim doc as msxml2.domdocument
' 實(shí)例化一個(gè) xmldomdocument 對(duì)象
doc = new msxml2.domdocument()
' 將 xml 載入 dom
doc.loadxml(orderxml)
' 將 dom 傳遞到現(xiàn)有代碼
ec.example7(doc)
xml 字符串
xml 是一種在層與層之間傳遞數(shù)據(jù)的簡(jiǎn)單方法。它還將數(shù)據(jù)的 xml 轉(zhuǎn)換過(guò)程推到 com 互操作邊界的“現(xiàn)有代碼”端,根據(jù)接口的不同,這可能會(huì)比在 com 互操作邊界將數(shù)據(jù)轉(zhuǎn)換為 xml 更有效。
讀數(shù)據(jù)
以下示例中,現(xiàn)有代碼返回一個(gè)包含 xml 數(shù)據(jù)的字符串,然后,該字符串由 web 服務(wù)傳遞給客戶:
ec = new excode.exclass()
' 將 xml 字符串直接從現(xiàn)有代碼傳遞給客戶
example8 = ec.example8()
寫(xiě)數(shù)據(jù)
以下示例中,層次行數(shù)據(jù)的 xml 表示作為字符串傳遞到現(xiàn)有代碼:
ec = new excode.exclass()
' 將 xml 字符串直接從客戶傳遞到現(xiàn)有代碼
ec.example9(orderxml)
總結(jié)
本文及附帶的示例介紹了有關(guān)數(shù)據(jù)轉(zhuǎn)換的信息。通過(guò)數(shù)據(jù)轉(zhuǎn)換,可以使用 asp.net 將現(xiàn)有代碼作為 web 服務(wù)提供。本文討論了一些常用的接口對(duì)象,其中包括 xml 字符串,如果使用相應(yīng)的接口對(duì)現(xiàn)有代碼進(jìn)行擴(kuò)展,它可以涵蓋大多數(shù)數(shù)據(jù)。
這些解決方案的性能各異,并且受所傳遞的數(shù)據(jù)大小影響。在本系列后面的文章中,我們將對(duì)這些實(shí)現(xiàn)方法進(jìn)行比較。
評(píng)估現(xiàn)有代碼是否適合作為 web 服務(wù)時(shí),接口只不過(guò)是應(yīng)當(dāng)考慮的諸多因素之一。應(yīng)考慮的其它因素包括安全性(包括授權(quán)、身份驗(yàn)證和加密)、事務(wù)模型、狀態(tài)模型、返回錯(cuò)誤和結(jié)果的方式,以及代碼是同步還是異步執(zhí)行,等等。