直播中
本文探討各方面的變化,以便讓用戶清楚地了解建立 ASP 應(yīng)用程序并使其在 ASP .NET 環(huán)境中運行所必須進(jìn)行的一些工作。同時,它還指出了 ASP .NET 的一些新特性,用戶可以充分利用這些新特性改進(jìn)現(xiàn)有的應(yīng)用程序。但這決不是 ASP .NET 所有新特性的全面介紹,而只是著重探討一下成功遷移時需考慮的一些問題。
我設(shè)想,由于大多數(shù) ASP 應(yīng)用程序都使用 Microsoft® Visual Basic® Scripting Edition (VBScript),所以大多數(shù)用戶都會選擇使用 Visual Basic .NET 遷移到 ASP .NET。顯然,這不是必需的。但如果決定在遷移的同時更改語言,將需要進(jìn)行一些額外的工作,而且很可能還會涉及到設(shè)計和結(jié)構(gòu)方面的更改。
共存性
在討論具體的兼容性和遷移問題之前,了解一下 ASP 和 ASP .NET 如何共存非常重要。ASP 和 ASP .NET 應(yīng)用程序可以同時在服務(wù)器上運行,而互不影響。這主要是由于兩種技術(shù)各自使用不同的文件擴(kuò)展名(.asp 與 .aspx)和不同的配置模型(配置數(shù)據(jù)庫/注冊表與基于 XML 的配置文件)。這兩種系統(tǒng)還各自具有相應(yīng)的處理引擎。
讓某個應(yīng)用程序的一部分運行 ASP,而另一部分運行 ASP .NET,這是完全可能的。如果需要將一個快速發(fā)展的大型站點一次一小部分地遷移到 ASP .NET,這種特性將對您大有益處。某些用戶可能會說,最好能一次性遷移和部署整個站點。對于某些類型的 Web 應(yīng)用程序來說也許是如此,但我認(rèn)為,有許多站點并不能這樣:考慮到站點內(nèi)容和外觀的絕對大小、復(fù)雜程度以及迅速變化,這種方式非常缺乏靈活性。畢竟,對于一個盈利的網(wǎng)站來說,那些掏腰包的人不可能允許您停止他們的新增功能,而將整個網(wǎng)站遷移到這種熱門的新技術(shù)。另外,如果把向 ASP .NET 遷移作為一項長期投資,您將希望利用此機(jī)會盡可能多地對結(jié)構(gòu)和設(shè)計做一些改進(jìn)。綜合這些情況,分階段的共存性遷移是絕對必要的。
兼容性問題
將應(yīng)用程序向 ASP .NET 遷移可能不是一件容易的事情;但是,也不應(yīng)該很困難。ASP .NET 與 ASP 的兼容性非常好,給用戶的感覺就好象 ASP .NET 是 ASP 的一個完整翻版。ASP .NET 設(shè)計者的最初目標(biāo)是實現(xiàn)與 ASP 百分之百的向后兼容性,但在隨后的工作中,他們不得不改變了這一初衷,以便徹底地改進(jìn)這一平臺。不過不要擔(dān)心,我們盡可能進(jìn)行了大量改進(jìn),應(yīng)該不會需要您進(jìn)行太多的工作。所發(fā)生的實際變化可以歸納為下列幾類:
核心 API 的變化
結(jié)構(gòu)變化
Visual Basic 語言的變化
與 COM 有關(guān)的變化
應(yīng)用程序配置的變化
狀態(tài)管理問題
與安全性有關(guān)的變化
數(shù)據(jù)訪問
下面將詳細(xì)討論上述各個方面的變化。
核心 API 的變化
ASP 的核心 API 由幾個固有對象(Request、Response 和 Server 等)及其有關(guān)方法組成。除幾處簡單變化之外,這些 API 在 ASP .NET 下可以繼續(xù)正常運行。所有變化都與 Request 對象有關(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。
正如您所見,對于涉及到的所有方法,其變化基本上都相同。
如果訪問的 item(項)只包含特定關(guān)鍵字的一個值,您將不必修改自己的代碼。但是,如果給定的關(guān)鍵字具有多個值,您將需要使用其它方法返回值的集合。另請注意,Visual Basic .NET 中的集合都是基于 0,而 VBScript 中的集合是基于 1 的。
例如,在 ASP 中,將按下列方式訪問 http://localhost/myweb/valuetest.asp?values=10&values=20 請求返回的各個查詢字符串值:
<%
'輸出“10”
Response.Write Request.QueryString("values")(1)
'輸出“20”
Response.Write Request.QueryString("values")(2)
%>
在 ASP .NET 中,QueryString 屬性返回 NameValueCollection 對象,在檢索所需的實際項之前,將需要從該對象中檢索 Values 集合。另外需要注意,集合中的第一項是使用 0 而非 1 索引進(jìn)行檢索的:
<%
'輸出“10”
Response.Write (Request.QueryString.GetValues("values")(0))
'輸出“20”
Response.Write (Request.QueryString.GetValues("values")(1))
%>
下列代碼在 ASP 和 ASP .NET 中的運行結(jié)果相同:
<%
'輸出“10”和“20”
Response.Write (Request.QueryString("values"))
%>
結(jié)構(gòu)變化
結(jié)構(gòu)變化將影響 Active Server Pages 的布局和編碼樣式。您需要了解其中的一些信息,以確保您的代碼能夠在 ASP .NET 中運行。
代碼塊:聲明函數(shù)和變量
在 ASP 中,可以在代碼分隔符之間聲明子程序和全局變量。
<%
Dim X
Dim str
Sub MySub()
Response.Write "這是一個字符串。"
End Sub
%>
在 ASP .NET 中,不允許以這種方式進(jìn)行聲明。您必須在 <script> 塊中聲明所有函數(shù)和變量。
<script language = "vb" runat = "server">
Dim str As String
Dim x, y As Integer
Function Add(I As Integer, J As Integer) As Integer
Return (I + J)
End Function
</script>
混合編程語言
在 ASP 中,基本上有兩種編程語言供您選擇:VBScript 或 Microsoft® JScript®。在同一網(wǎng)頁中,您可以隨意組合和匹配各種腳本塊。
在 ASP .NET 中,目前有三種語言可供您選擇:C#、Visual Basic .NET 或 JScript。注意,我說的是 Visual Basic .NET,而不是 VBScript。這是因為 .NET 平臺上不存在 VBScript,它已被完全集成到 Visual Basic .NET 中。雖然可以自由選擇其中的任意一種語言,但需要注意的是,您不能像在 ASP 中那樣在同一網(wǎng)頁中使用多種語言。您的確可以在同一個應(yīng)用程序的 Page1.aspx 中使用 C# 代碼,而在 Page2.aspx 中使用 Visual Basic .NET 代碼,只是您不能在同一頁中混用它們。
新增的 Page 指令
在 ASP 中,必須將所有指令置于網(wǎng)頁中同一分隔塊內(nèi)的第一行。例如:
<%LANGUAGE="VBSCRIPT" CODEPAGE="932"%>
在 ASP .NET 中,需要將 Language 指令替換為 Page 指令,如下所示:
<%@Page Language="VB" CodePage="932"%>
<%@QutputCache Duration="60" VaryByParam="none" %>
可以根據(jù)需要包含任意多行指令。指令可以位于 .apsx 文件中的任意位置,但標(biāo)準(zhǔn)做法是將其置于文件的最開頭。
在 ASP .NET 中新增了幾個指令。我鼓勵您在 ASP .NET 文檔中查看一下這些指令,了解它們可以為您的應(yīng)用程序帶來什么樣的好處。
生成函數(shù)不再有效
開發(fā)者指出,在 ASP 中,他們可以使用“生成函數(shù)”靈活處理一些問題?!吧珊瘮?shù)”基本上是一個子程序,在其主體中嵌入了大量 HTML。例如:
<%Sub RenderMe()
%>
<H3> 這是正在生成的 HTML 文本。</H3>
<%End Sub
RenderMe
%>
雖然使用這類函數(shù)能夠?qū)崿F(xiàn)非??岬墓δ埽?ASP .NET 中不允許使用這類編碼。這可能是出于優(yōu)化性能的考慮。我想您肯定遇到過,像這樣將代碼與 HTML 混在一起時,有些函數(shù)很快就變得可讀性極差,而且難以管理。在 ASP .NET 中,實現(xiàn)此目的的最簡單方法是調(diào)用 Response.Write 來代替 HTML 輸出,如下所示:
<script language="vb" runat="server">
Sub RenderMe()
Response.Write("<H3> 這是正在生成的 HTML 文本。</H3>")
End Sub
</script>
<%
Call RenderMe()
%>
注意,我說的是“最簡單的方法”,但并不一定表示是最佳方法。根據(jù)生成代碼的復(fù)雜程度和數(shù)量,使用自定義 Web 控件效果可能更好,這種控件允許您通過編程設(shè)置 HTML 屬性,并將代碼與內(nèi)容真正分開,使代碼可讀性更強。
Visual Basic 語言的變化
正如我前面提到過的,VBScript 已集成到了更完整、功能更強大的 Visual Basic .NET 中。這一節(jié),我將重點講述您可能會遇到的與 Visual Basic 語言變化有關(guān)的一些問題。但需注意,這并不是詳盡的 Visual Basic 變化列表。我只是著重講述作為一名 ASP/VBScript 程序員,在使用 Visual Basic .NET 向 ASP .NET 遷移時可能會遇到的一些問題。有關(guān)所有語言變化的詳盡列表,請參見 Visual Basic .NET 文檔。
告別 Variant 數(shù)據(jù)類型
我們熟悉它、喜歡它,對它又愛又恨。當(dāng)然,我說的是 VARIANT 數(shù)據(jù)類型。.NET 中沒有 VARIANT,因此 Visual Basic .NET 不支持這種數(shù)據(jù)類型。這意味著,您的所有 ASP 變量將悄悄地由 VARIANT 類型更改為 Object 類型。根據(jù)需要,應(yīng)用程序中使用的大量變量可以而且應(yīng)該更改為相應(yīng)的基元類型。如果您的變量實際上是 Visual Basic 中的 object 類型,則只需在 ASP .NET 中將其顯式聲明為 Object 類型。
Visual Basic Date 類型
值得特別注意的一種 VARIANT 類型是 VT_DATE,它在 Visual Basic 中以 Date 類型出現(xiàn)。在 Visual Basic 中,使用四個字節(jié)以 Double 格式存儲 Date。在 Visual Basic .NET 中,Date 使用公共語言運行庫 DateTime 類型,該類型使用八個字節(jié)整數(shù)表示。
由于 ASP 中的所有類型都是 VARIANT,對于所需的 Date 變量,將根據(jù)它們的使用方式進(jìn)行編譯并可以繼續(xù)使用。但是,使用變量執(zhí)行某些操作時,由于基本類型已發(fā)生變化,所以可能會遇到一些意想不到的問題。在將日期值作為長整型值傳遞給 COM 對象時,或使用 CLng 對日期類型執(zhí)行某些計算時,需特別注意。
Option Explicit 現(xiàn)在是默認(rèn)值
在 ASP 中,可以使用 Option Explicit 關(guān)鍵字,但它不是默認(rèn)值。在 Visual Basic .NET 中,情況有所不同。Option Explicit 現(xiàn)在是默認(rèn)值,因此,所有變量都需要聲明。更嚴(yán)格地要求聲明并將設(shè)置更改為 Option Strict 是一種比較明智的作法。這樣做將迫使您將所有變量聲明為特定的數(shù)據(jù)類型。乍看起來這是一項額外的工作,但實際上這是正確的做事方式。如果不這樣做,您的代碼將達(dá)不到最優(yōu)狀態(tài),因為所有未聲明的變量都將更改為 Object 類型。大多數(shù)隱式約定仍然有效,但如果將所有變量顯式聲明為所需類型,則能達(dá)到更好的效果,而且更安全。
不再支持 LET 和 SET
可以將一個對象直接賦值給另一對象,如 MyObj1 = MyObj2,而不再需要使用 SET 或 LET 語句。如果使用了這些語句,必須將其刪除。
在方法調(diào)用中使用括號
在 ASP 中,您可以任意調(diào)用對象方法,而不必使用括號,如下所示:
Sub WriteData()
Response.Write "這是數(shù)據(jù)"
End Sub
WriteData
在 ASP .NET 中,所有調(diào)用都必須使用括號,即使是調(diào)用不帶任何括號的方法。如下例所示編寫代碼,使其在 ASP 和 ASP .NET 中都可以正確運行。
Sub WriteData()
Response.Write("這是數(shù)據(jù)")
End Sub
Call WriteData()
ByVal 現(xiàn)在是默認(rèn)值
在 Visual Basic 中,默認(rèn)情況下,所有參數(shù)都通過引用或 ByRef 進(jìn)行傳遞。在 Visual Basic .NET 中,情況有所不同?,F(xiàn)在,默認(rèn)情況下,所有參數(shù)都通過值或 ByVal 進(jìn)行傳遞。如果仍要使用 ByRef,必須在參數(shù)前面顯式使用 ByRef 關(guān)鍵字,如下所示:
Sub MyByRefSub (ByRef Value)
Value = 53;
End Sub
這一點必須特別注意。向 ASP .NET 遷移代碼時,建議您仔細(xì)檢查方法調(diào)用中使用的每個參數(shù),確保這種變化是您真正需要的。我想您可能需要更改其中的某些參數(shù)。
不再有默認(rèn)屬性
在 Visual Basic .NET 中,不再存在默認(rèn)屬性的概念。這就意味著,如果您的 ASP 代碼依賴于某個對象提供的默認(rèn)屬性,則需要更改為顯式引用所需屬性,如下列代碼所示:
'ASP 語法(隱式檢索 Column Value 屬性)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("TestDB")
Set RS = Conn.Execute("Select * from Products")
Response.Write RS("Name")
'ASP.NET 語法(顯示檢索 Column Value 屬性)
Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("TestDB")
RS = Conn.Execute("Select * from Products")
Response.Write (RS("Name").Value)
數(shù)據(jù)類型的變化
在 Visual Basic .NET 中,Integer 值現(xiàn)在是 32 位,Long 類型已變成 64 位。
從 ASP .NET 中調(diào)用 COM 對象方法時,或調(diào)用自定義 Visual Basic 組件中的 Microsoft® Win32® API 調(diào)用時,可能會出現(xiàn)問題。應(yīng)特別注意需要的實際數(shù)據(jù)類型,確保傳遞或計算的值正確。
結(jié)構(gòu)化異常處理
雖然人們所熟悉的 On Error Resume Next 和 On Error Goto 錯誤處理技術(shù)在 Visual Basic .NET 中仍可使用,但它們不再是進(jìn)行錯誤處理的最佳方法。Visual Basic 現(xiàn)在具有一種完善的結(jié)構(gòu)化異常處理方法,它使用 Try、Catch 和 Finally 關(guān)鍵字。如果可能,您應(yīng)該遷移到這種新模式進(jìn)行錯誤處理,因為它具有更強大、更一致的應(yīng)用程序錯誤處理機(jī)制。