簡(jiǎn)介 雖然 Microsoft® asp .NET 的設(shè)計(jì)者在保持 ASP 應(yīng)用程序的向后兼容性方面做了大量不懈的努力,但在將 Web 應(yīng)用程序由 ASP 向 ASP .NET 遷移之前,還是應(yīng)該了解一下幾個(gè)關(guān)鍵的問題。在 .NET 平臺(tái)和 ASP .NET 中對(duì)現(xiàn)有技術(shù)進(jìn)行了改進(jìn)并采用了一些新技術(shù),透徹理解這些技術(shù)有利于簡(jiǎn)化此遷移過程,但這需要經(jīng)過一段漫長(zhǎng)的時(shí)間。
本文探討各方面的變化,以便讓用戶清楚地了解建立 ASP 應(yīng)用程序并使其在 ASP .NET 環(huán)境中運(yùn)行所必須進(jìn)行的一些工作。同時(shí),它還指出了 ASP .NET 的一些新特性,用戶可以充分利用這些新特性改進(jìn)現(xiàn)有的應(yīng)用程序。但這決不是 ASP .NET 所有新特性的全面介紹,而只是著重探討一下成功遷移時(shí)需考慮的一些問題。
我設(shè)想,由于大多數(shù) ASP 應(yīng)用程序都使用 Microsoft® Visual Basic® Scripting Edition (VBScript),所以大多數(shù)用戶都會(huì)選擇使用 Visual Basic .NET 遷移到 ASP .NET。顯然,這不是必需的。但如果決定在遷移的同時(shí)更改語(yǔ)言,將需要進(jìn)行一些額外的工作,而且很可能還會(huì)涉及到設(shè)計(jì)和結(jié)構(gòu)方面的更改。
共存性 在討論具體的兼容性和遷移問題之前,了解一下 ASP 和 ASP .NET 如何共存非常重要。ASP 和 ASP .NET 應(yīng)用程序可以同時(shí)在服務(wù)器上運(yùn)行,而互不影響。這主要是由于兩種技術(shù)各自使用不同的文件擴(kuò)展名(.asp 與 .aspx)和不同的配置模型(配置數(shù)據(jù)庫(kù)/注冊(cè)表與基于 xml 的配置文件)。這兩種系統(tǒng)還各自具有相應(yīng)的處理引擎。
讓某個(gè)應(yīng)用程序的一部分運(yùn)行 ASP,而另一部分運(yùn)行 ASP .NET,這是完全可能的。如果需要將一個(gè)快速發(fā)展的大型站點(diǎn)一次一小部分地遷移到 ASP .NET,這種特性將對(duì)您大有益處。某些用戶可能會(huì)說(shuō),最好能一次性遷移和部署整個(gè)站點(diǎn)。對(duì)于某些類型的 Web 應(yīng)用程序來(lái)說(shuō)也許是如此,但我認(rèn)為,有許多站點(diǎn)并不能這樣:考慮到站點(diǎn)內(nèi)容和外觀的絕對(duì)大小、復(fù)雜程度以及迅速變化,這種方式非常缺乏靈活性。畢竟,對(duì)于一個(gè)盈利的網(wǎng)站來(lái)說(shuō),那些掏腰包的人不可能允許您停止他們的新增功能,而將整個(gè)網(wǎng)站遷移到這種熱門的新技術(shù)。另外,如果把向 ASP .NET 遷移作為一項(xiàng)長(zhǎng)期投資,您將希望利用此機(jī)會(huì)盡可能多地對(duì)結(jié)構(gòu)和設(shè)計(jì)做一些改進(jìn)。綜合這些情況,分階段的共存性遷移是絕對(duì)必要的。
兼容性問題 將應(yīng)用程序向 ASP .NET 遷移可能不是一件容易的事情;但是,也不應(yīng)該很困難。ASP .NET 與 ASP 的兼容性非常好,給用戶的感覺就好象 ASP .NET 是 ASP 的一個(gè)完整翻版。ASP .NET 設(shè)計(jì)者的最初目標(biāo)是實(shí)現(xiàn)與 ASP 百分之百的向后兼容性,但在隨后的工作中,他們不得不改變了這一初衷,以便徹底地改進(jìn)這一平臺(tái)。不過不要擔(dān)心,我們盡可能進(jìn)行了大量改進(jìn),應(yīng)該不會(huì)需要您進(jìn)行太多的工作。所發(fā)生的實(shí)際變化可以歸納為下列幾類:
核心 API 的變化 結(jié)構(gòu)變化 Visual Basic 語(yǔ)言的變化 與 COM 有關(guān)的變化 應(yīng)用程序配置的變化 狀態(tài)管理問題 與安全性有關(guān)的變化 數(shù)據(jù)訪問 下面將詳細(xì)討論上述各個(gè)方面的變化。
核心 API 的變化 ASP 的核心 API 由幾個(gè)固有對(duì)象(Request、Response 和 Server 等)及其有關(guān)方法組成。除幾處簡(jiǎn)單變化之外,這些 API 在 ASP .NET 下可以繼續(xù)正常運(yùn)行。所有變化都與 Request 對(duì)象有關(guān),如表 1 所示:
表 1:API 的變化
方法 變化 Request(item) 在 ASP 中,此方法返回字符串?dāng)?shù)組。在 ASP .NET 中,它返回 NameValueCollection。 Request.QueryString(item) 在 ASP 中,此方法返回字符串?dāng)?shù)組。在 ASP .NET 中,它返回 NameValueCollection。 Request.Form(item) 在 ASP 中,此方法返回字符串?dāng)?shù)組。在 ASP .NET 中,它返回 NameValueCollection。
在 ASP .NET 中新增了幾個(gè)指令。我鼓勵(lì)您在 ASP .NET 文檔中查看一下這些指令,了解它們可以為您的應(yīng)用程序帶來(lái)什么樣的好處。
生成函數(shù)不再有效 開發(fā)者指出,在 ASP 中,他們可以使用“生成函數(shù)”靈活處理一些問題。“生成函數(shù)”基本上是一個(gè)子程序,在其主體中嵌入了大量 HTML。例如:
<%Sub RenderMe() %> <H3> 這是正在生成的 HTML 文本。</H3> <%End Sub RenderMe %>
雖然使用這類函數(shù)能夠?qū)崿F(xiàn)非常酷的功能,但 ASP .NET 中不允許使用這類編碼。這可能是出于優(yōu)化性能的考慮。我想您肯定遇到過,像這樣將代碼與 HTML 混在一起時(shí),有些函數(shù)很快就變得可讀性極差,而且難以管理。在 ASP .NET 中,實(shí)現(xiàn)此目的的最簡(jiǎn)單方法是調(diào)用 Response.Write 來(lái)代替 HTML 輸出,如下所示:
<script language="vb" runat="server"> Sub RenderMe() Response.Write("<H3> 這是正在生成的 HTML 文本。</H3>") End Sub </script>
<% Call RenderMe() %>
注意,我說(shuō)的是“最簡(jiǎn)單的方法”,但并不一定表示是最佳方法。根據(jù)生成代碼的復(fù)雜程度和數(shù)量,使用自定義 Web 控件效果可能更好,這種控件允許您通過編程設(shè)置 HTML 屬性,并將代碼與內(nèi)容真正分開,使代碼可讀性更強(qiáng)。
由于 ASP 中的所有類型都是 VARIANT,對(duì)于所需的 Date 變量,將根據(jù)它們的使用方式進(jìn)行編譯并可以繼續(xù)使用。但是,使用變量執(zhí)行某些操作時(shí),由于基本類型已發(fā)生變化,所以可能會(huì)遇到一些意想不到的問題。在將日期值作為長(zhǎng)整型值傳遞給 COM 對(duì)象時(shí),或使用 CLng 對(duì)日期類型執(zhí)行某些計(jì)算時(shí),需特別注意。
這一點(diǎn)必須特別注意。向 ASP .NET 遷移代碼時(shí),建議您仔細(xì)檢查方法調(diào)用中使用的每個(gè)參數(shù),確保這種變化是您真正需要的。我想您可能需要更改其中的某些參數(shù)。
不再有默認(rèn)屬性 在 Visual Basic .NET 中,不再存在默認(rèn)屬性的概念。這就意味著,如果您的 ASP 代碼依賴于某個(gè)對(duì)象提供的默認(rèn)屬性,則需要更改為顯式引用所需屬性,如下列代碼所示:
'ASP 語(yǔ)法(隱式檢索 Column Value 屬性) Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open("TestDB") Set RS = Conn.Execute("Select * from PRoducts") Response.Write RS("Name")
'asp.net 語(yǔ)法(顯示檢索 Column Value 屬性) Conn = Server.CreateObject("ADODB.Connection") Conn.Open("TestDB") RS = Conn.Execute("Select * from Products") Response.Write (RS("Name").Value)
從 ASP .NET 中調(diào)用 COM 對(duì)象方法時(shí),或調(diào)用自定義 Visual Basic 組件中的 Microsoft® Win32® API 調(diào)用時(shí),可能會(huì)出現(xiàn)問題。應(yīng)特別注意需要的實(shí)際數(shù)據(jù)類型,確保傳遞或計(jì)算的值正確。
結(jié)構(gòu)化異常處理 雖然人們所熟悉的 On Error Resume Next 和 On Error Goto 錯(cuò)誤處理技術(shù)在 Visual Basic .NET 中仍可使用,但它們不再是進(jìn)行錯(cuò)誤處理的最佳方法。Visual Basic 現(xiàn)在具有一種完善的結(jié)構(gòu)化異常處理方法,它使用 Try、Catch 和 Finally 關(guān)鍵字。如果可能,您應(yīng)該遷移到這種新模式進(jìn)行錯(cuò)誤處理,因?yàn)樗哂懈鼜?qiáng)大、更一致的應(yīng)用程序錯(cuò)誤處理機(jī)制。