遷移到 ASP .NET:需考慮的重要問題
發(fā)表時(shí)間:2024-05-29 來源:明輝站整理相關(guān)軟件相關(guā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)并采用...
雖然 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í)更改語言,將需要進(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ì)說,最好能一次性遷移和部署整個(gè)站點(diǎn)。對(duì)于某些類型的 Web 應(yīng)用程序來說也許是如此,但我認(rèn)為,有許多站點(diǎn)并不能這樣:考慮到站點(diǎn)內(nèi)容和外觀的絕對(duì)大小、復(fù)雜程度以及迅速變化,這種方式非常缺乏靈活性。畢竟,對(duì)于一個(gè)盈利的網(wǎng)站來說,那些掏腰包的人不可能允許您停止他們的新增功能,而將整個(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 語言的變化 與 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。正如您所見,對(duì)于涉及到的所有方法,其變化基本上都相同。如果訪問的 item(項(xiàng))只包含特定關(guān)鍵字的一個(gè)值,您將不必修改自己的代碼。但是,如果給定的關(guān)鍵字具有多個(gè)值,您將需要使用其它方法返回值的集合。另請(qǐng)注意,Visual Basic .NET 中的集合都是基于 0,而 VBScript 中的集合是基于 1 的。例如,在 ASP 中,將按下列方式訪問 http://localhost/myweb/valuetest.asp?values=10&values=20 請(qǐng)求返回的各個(gè)查詢字符串值:<% '輸出“10” Response.Write Request.QueryString("values")(1) '輸出“20” Response.Write Request.QueryString("values")(2)%>在 ASP .NET 中,QueryString 屬性返回 NameValueCollection 對(duì)象,在檢索所需的實(shí)際項(xiàng)之前,將需要從該對(duì)象中檢索 Values 集合。另外需要注意,集合中的第一項(xiàng)是使用 0 而非 1 索引進(jìn)行檢索的:<% '輸出“10” Response.Write (Request.QueryString.GetValues("values")(0)) '輸出“20” Response.Write (Request.QueryString.GetValues("values")(1))%>下列代碼在 ASP 和 ASP .NET 中的運(yùn)行結(jié)果相同:<% '輸出“10”和“20” Response.Write (Request.QueryString("values"))%>結(jié)構(gòu)變化結(jié)構(gòu)變化將影響 Active Server Pages 的布局和編碼樣式。您需要了解其中的一些信息,以確保您的代碼能夠在 ASP .NET 中運(yùn)行。代碼塊:聲明函數(shù)和變量在 ASP 中,可以在代碼分隔符之間聲明子程序和全局變量。<% Dim X Dim str Sub MySub() Response.Write "這是一個(gè)字符串。" 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)頁(yè)中,您可以隨意組合和匹配各種腳本塊。在 ASP .NET 中,目前有三種語言可供您選擇:C#、Visual Basic .NET 或 JScript。注意,我說的是 Visual Basic .NET,而不是 VBScript。這是因?yàn)?.NET 平臺(tái)上不存在 VBScript,它已被完全集成到 Visual Basic .NET 中。雖然可以自由選擇其中的任意一種語言,但需要注意的是,您不能像在 ASP 中那樣在同一網(wǎng)頁(yè)中使用多種語言。您的確可以在同一個(gè)應(yīng)用程序的 Page1.aspx 中使用 C# 代碼,而在 Page2.aspx 中使用 Visual Basic .NET 代碼,只是您不能在同一頁(yè)中混用它們。新增的 Page 指令在 ASP 中,必須將所有指令置于網(wǎng)頁(yè)中同一分隔塊內(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 中新增了幾個(gè)指令。我鼓勵(lì)您在 ASP .NET 文檔中查看一下這些指令,了解它們可以為您的應(yīng)用程序帶來什么樣的好處。生成函數(shù)不再有效開發(fā)者指出,在 ASP 中,他們可以使用“生成函數(shù)”靈活處理一些問題。“生成函數(shù)”基本上是一個(gè)子程序,在其主體中嵌入了大量 HTML。例如:<%Sub RenderMe()%><H3> 這是正在生成的 HTML 文本。</H3><%End SubRenderMe%>雖然使用這類函數(shù)能夠?qū)崿F(xiàn)非常酷的功能,但 ASP .NET 中不允許使用這類編碼。這可能是出于優(yōu)化性能的考慮。我想您肯定遇到過,像這樣將代碼與 HTML 混在一起時(shí),有些函數(shù)很快就變得可讀性極差,而且難以管理。在 ASP .NET 中,實(shí)現(xiàn)此目的的最簡(jiǎn)單方法是調(diào)用 Response.Write 來代替 HTML 輸出,如下所示:<script language="vb" runat="server"> Sub RenderMe() Response.Write("<H3> 這是正在生成的 HTML 文本。</H3>") End Sub</script><% Call RenderMe()%>注意,我說的是“最簡(jiǎn)單的方法”,但并不一定表示是最佳方法。根據(jù)生成代碼的復(fù)雜程度和數(shù)量,使用自定義 Web 控件效果可能更好,這種控件允許您通過編程設(shè)置 HTML 屬性,并將代碼與內(nèi)容真正分開,使代碼可讀性更強(qiáng)。Visual Basic 語言的變化正如我前面提到過的,VBScript 已集成到了更完整、功能更強(qiáng)大的 Visual Basic .NET 中。這一節(jié),我將重點(diǎn)講述您可能會(huì)遇到的與 Visual Basic 語言變化有關(guān)的一些問題。但需注意,這并不是詳盡的 Visual Basic 變化列表。我只是著重講述作為一名 ASP/VBScript 程序員,在使用 Visual Basic .NET 向 ASP .NET 遷移時(shí)可能會(huì)遇到的一些問題。有關(guān)所有語言變化的詳盡列表,請(qǐng)參見 Visual Basic .NET 文檔。告別 Variant 數(shù)據(jù)類型我們熟悉它、喜歡它,對(duì)它又愛又恨。當(dāng)然,我說的是 VARIANT 數(shù)據(jù)類型。.NET 中沒有 VARIANT,因此 Visual Basic .NET 不支持這種數(shù)據(jù)類型。這意味著,您的所有 ASP 變量將悄悄地由 VARIANT 類型更改為 Object 類型。根據(jù)需要,應(yīng)用程序中使用的大量變量可以而且應(yīng)該更改為相應(yīng)的基元類型。如果您的變量實(shí)際上是 Visual Basic 中的 object 類型,則只需在 ASP .NET 中將其顯式聲明為 Object 類型。 Visual Basic Date 類型值得特別注意的一種 VARIANT 類型是 VT_DATE,它在 Visual Basic 中以 Date 類型出現(xiàn)。在 Visual Basic 中,使用四個(gè)字節(jié)以 Double 格式存儲(chǔ) Date。在 Visual Basic .NET 中,Date 使用公共語言運(yùn)行庫(kù) DateTime 類型,該類型使用八個(gè)字節(jié)整數(shù)表示。 由于 ASP 中的所有類型都是 VARIANT,對(duì)于所需的 Date 變量,將根據(jù)它們的使用方式進(jìn)行編譯并可以繼續(xù)使用。但是,使用變量執(zhí)行某些操作時(shí),由于基本類型已發(fā)生變化,所以可能會(huì)遇到一些意想不到的問題。在將日期值作為長(zhǎng)整型值傳遞給 COM 對(duì)象時(shí),或使用 CLng 對(duì)日期類型執(zhí)行某些計(jì)算時(shí),需特別注意。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ù)類型。乍看起來這是一項(xiàng)額外的工作,但實(shí)際上這是正確的做事方式。如果不這樣做,您的代碼將達(dá)不到最優(yōu)狀態(tài),因?yàn)樗形绰暶鞯淖兞慷紝⒏臑?Object 類型。大多數(shù)隱式約定仍然有效,但如果將所有變量顯式聲明為所需類型,則能達(dá)到更好的效果,而且更安全。不再支持 LET 和 SET可以將一個(gè)對(duì)象直接賦值給另一對(duì)象,如 MyObj1 = MyObj2,而不再需要使用 SET 或 LET 語句。如果使用了這些語句,必須將其刪除。在方法調(diào)用中使用括號(hào)在 ASP 中,您可以任意調(diào)用對(duì)象方法,而不必使用括號(hào),如下所示:Sub WriteData() Response.Write "這是數(shù)據(jù)"End SubWriteData在 ASP .NET 中,所有調(diào)用都必須使用括號(hào),即使是調(diào)用不帶任何括號(hào)的方法。如下例所示編寫代碼,使其在 ASP 和 ASP .NET 中都可以正確運(yùn)行。Sub WriteData() Response.Write("這是數(shù)據(jù)")End SubCall 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這一點(diǎn)必須特別注意。向 ASP .NET 遷移代碼時(shí),建議您仔細(xì)檢查方法調(diào)用中使用的每個(gè)參數(shù),確保這種變化是您真正需要的。我想您可能需要更改其中的某些參數(shù)。不再有默認(rèn)屬性在 Visual Basic .NET 中,不再存在默認(rèn)屬性的概念。這就意味著,如果您的 ASP 代碼依賴于某個(gè)對(duì)象提供的默認(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 對(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ī)制。與 COM 有關(guān)的變化隨著 .NET 框架和 ASP .NET 的誕生,COM 實(shí)際上沒有發(fā)生任何變化。但這并不表示在 ASP .NET 中使用 COM 對(duì)象時(shí)不必?fù)?dān)心和考慮他們的行為。有一些基本情況,您必須了解。線程模式的變化ASP .NET 線程模式是多線程單元 (MTA)。這就意味著,對(duì)于目前使用的為單線程單元 (STA) 創(chuàng)建的組件,如果不采取額外的措施,將不能在 ASP .NET 中可靠地執(zhí)行或運(yùn)行。其中包括但不限于使用 Visual Basic 6.0 及其更低版本創(chuàng)建的所有 COM 組件。ASPCOMPAT 屬性您將很高興聽到這樣一個(gè)消息:仍然可以使用這些 STA 組件,而不需要更改任何代碼。您需要做的工作只是在 ASP .NET 網(wǎng)頁(yè)的 <%@Page> 標(biāo)記中包含兼容性屬性 aspcompat=true,如 <%@Page aspcompat=true Language=VB%>。使用此屬性將強(qiáng)制網(wǎng)頁(yè)以 STA 模式執(zhí)行,從而確保您的組件可以繼續(xù)正確運(yùn)行。如果試圖使用 STA 組件但沒有指定此標(biāo)記,運(yùn)行時(shí)將會(huì)發(fā)生異常情況。將此屬性的值設(shè)置為 true 時(shí),將允許網(wǎng)頁(yè)調(diào)用 COM+ 1.0 組件,該組件需要訪問非管理的 ASP 內(nèi)置對(duì)象。可以通過 ObjectContext 對(duì)象進(jìn)行訪問。如果將此標(biāo)記的值設(shè)為 true,性能會(huì)稍微有些下降。建議只在確實(shí)需要時(shí)才這樣做。早期綁定與后期綁定在 ASP 中,對(duì) COM 對(duì)象的所有調(diào)用都是通過 IDispatch 接口進(jìn)行的。這種行為被稱為“后期綁定”,因?yàn)閷?duì)實(shí)際對(duì)象的調(diào)用是在運(yùn)行時(shí)通過 IDispatch 間接處理的。在 ASP .NET 中,只要您愿意,可以繼續(xù)以這種方式調(diào)用您的組件。Dim Obj As ObjectObj = Server.CreateObject("ProgID")Obj.MyMethodCall仍然可以使用這種方式訪問您的組件,但這不是首選方式,F(xiàn)在,在 ASP .NET 中,您可以利用早期綁定直接創(chuàng)建對(duì)象,如下所示:Dim Obj As New MyObjectMyObject.MyMethodCall()使用早期綁定,可以通過類型安全的方式與組件交互。為了在 COM 組件中使用早期綁定,您需要像在 Visual Basic 6.0 項(xiàng)目中添加 COM 引用一樣,在項(xiàng)目中添加一個(gè)引用。假設(shè)您正在使用 Visual Studio .NET,將在 COM 組件之上后臺(tái)創(chuàng)建一個(gè)管理的代理對(duì)象,給您的感覺就好像是直接在處理一個(gè) .NET 組件,而不是 COM 組件。現(xiàn)在,您可能會(huì)擔(dān)心性能問題。由于代理對(duì)象而引入了一個(gè)額外的層,所以使用 COM 協(xié)同操作時(shí)確實(shí)會(huì)存在一些問題。但是,大多數(shù)情況下,應(yīng)該不會(huì)遇到什么問題,因?yàn)檫M(jìn)行協(xié)同操作的實(shí)際 CPU 指令數(shù)仍然遠(yuǎn)遠(yuǎn)小于間接 IDispatch 調(diào)用的要求。您所得到的將遠(yuǎn)遠(yuǎn)超出您所失去的。當(dāng)然,理想情況是使用最新創(chuàng)建的管理對(duì)象,但我們知道,由于我們?cè)?COM 組件上的投入所限,并不總是能夠立即做到這一點(diǎn)。OnStartPage 和 OnEndPage 方法需要特別注意的是對(duì)舊版 OnStartPage 和 OnEndPage 方法的使用。如果您依賴于這些方法訪問 ASP 固有對(duì)象,將需要使用 ASPCOMPAT 指令和 Server.CreateObject 以早期綁定方式創(chuàng)建組件,如下所示:Dim Obj As MyObjObj = Server.CreateObject(MyObj)Obj.MyMethodCall()注意,我們并沒有使用“ProgID”,而是以早期綁定方式使用實(shí)際類型。為了讓這種方式有效,您需要在 Visual Studio 項(xiàng)目中添加 COM 組件引用,這樣才能創(chuàng)建早期綁定的包裝類。這是唯一必須繼續(xù)使用 Server.CreateObject 的情況。COM 總結(jié)表 2 總結(jié)了為繼續(xù)有效使用 COM 組件而必須完成的一些工作。表 2:舊版 COM 對(duì)象的 ASP .NET 設(shè)置COM 組件類型/方法ASP .NET 設(shè)置/過程自定義 STA(標(biāo)記為“Apartment”的 Visual Basic 組件或其它組件)使用 ASPCOMPAT 和早期綁定自定義 MTA(標(biāo)記為“Both”或“Free”的 ATL 或自定義 COM 組件)不使用 ASPCOMPAT,使用早期綁定固有對(duì)象(通過 ObjectContext 訪問)使用 ASPCOMPAT 和早期綁定OnStartPage 和 OnEndPage使用 ASPCOMPAT 和 Server.CreateObject(Type)無論您的組件是否部署在 COM+ 中,都將同樣應(yīng)用這些設(shè)置。應(yīng)用程序配置的變化在 ASP 中,所有 Web 應(yīng)用程序配置信息都存儲(chǔ)在系統(tǒng)注冊(cè)表和 IIS 配置數(shù)據(jù)庫(kù)中。由于服務(wù)器上經(jīng)常未安裝適當(dāng)?shù)墓芾砉ぞ,使得查看或修改設(shè)置變得非常困難。ASP .NET 引入了一整套全新的配置模型,這套模型以簡(jiǎn)單的、易讀的 XML 文件為基礎(chǔ)。每個(gè) ASP .NET 應(yīng)用程序都有自己的 Web.Config 文件,該文件位于主應(yīng)用程序目錄中。可以通過此文件控制 Web 應(yīng)用程序的自定義配置、行為和安全性。如果您與我一樣,您可能會(huì)通過“Internet 服務(wù)管理器”管理單元檢查和更改 ASP .NET 應(yīng)用程序的設(shè)置。但是,您必須了解,現(xiàn)在我們擁有兩種完全不同的配置模型。除一些安全性設(shè)置外,ASP .NET 應(yīng)用程序?qū)⒑雎允褂?IIS 管理工具配置的其它大部分設(shè)置。您需要將這些配置設(shè)置保存在 Web.Config 文件中。有關(guān) .NET 的應(yīng)用程序配置將在另一篇文章中詳細(xì)討論,此處就不詳細(xì)介紹了。表 3 說明了可以在自己的文件中配置的一些更有意義的設(shè)置。記住,還有更多設(shè)置。表 3:Web.Config 設(shè)置示例設(shè)置說明<appSettings>配置自定義應(yīng)用程序設(shè)置。<authentication>配置 ASP .NET 身份驗(yàn)證支持。<pages>標(biāo)識(shí)網(wǎng)頁(yè)特定的配置設(shè)置。<processModel>配置 IIS 系統(tǒng)中的 ASP .NET 進(jìn)程模型設(shè)置。<sessionState>指定會(huì)話狀態(tài)選項(xiàng)。在 .NET 基本類庫(kù)中還有其它一些類可用,它們簡(jiǎn)化了對(duì)這些設(shè)置的編程訪問。狀態(tài)管理如果應(yīng)用程序使用 Session 或 Application 固有對(duì)象存儲(chǔ)狀態(tài)信息,則在 ASP .NET 中可以繼續(xù)使用這些對(duì)象,而不會(huì)出現(xiàn)任何問題。隨之帶來的好處是,現(xiàn)在提供了更多的狀態(tài)存儲(chǔ)位置選項(xiàng)。狀態(tài)管理選項(xiàng)ASP .NET 中還包含其它一些狀態(tài)管理模型選項(xiàng),最終可使您管理不止一個(gè) Web 服務(wù)器,并支持通過 Web 場(chǎng)進(jìn)行狀態(tài)管理?梢栽 web.config 文件的 <sessionState> 一節(jié)中配置狀態(tài)管理選項(xiàng),如下所示:<sessionState mode="Inproc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;user id=sa;password=" cookieless="false" timeout="20"/>模式屬性指定將在何處存儲(chǔ)狀態(tài)信息?捎眠x項(xiàng)有 Inproc、StateServer、SqlServer 或 Off。表 4:會(huì)話狀態(tài)存儲(chǔ)信息選項(xiàng)說明Inproc會(huì)話狀態(tài)本地存儲(chǔ)在此服務(wù)器中(ASP 樣式)。StateServer會(huì)話狀態(tài)遠(yuǎn)程(或本地)存儲(chǔ)在狀態(tài)服務(wù)進(jìn)程中。SqlServer會(huì)話狀態(tài)存儲(chǔ)在 SQL Server 數(shù)據(jù)庫(kù)中。Off會(huì)話狀態(tài)被禁用。如果使用這些選項(xiàng)之一,StateConnectionString 和 sqlConnectionString 無疑將成為至關(guān)重要的參數(shù)。每個(gè)應(yīng)用程序只能使用一個(gè)存儲(chǔ)選項(xiàng)。存儲(chǔ) COM 組件需記住的的一點(diǎn)是,如果您依賴于對(duì) Session 或 Application 對(duì)象中舊版 COM 組件的存儲(chǔ)引用,將無法在應(yīng)用程序中使用新的狀態(tài)存儲(chǔ)機(jī)制(StateServer 或 SqlServer)。您將需要使用 Inproc。部分原因是對(duì)象需要在 .NET 中實(shí)現(xiàn)自我串行,很顯然,COM 組件無法做到這一點(diǎn)。另一方面,新創(chuàng)建的管理組件可以相對(duì)輕松地實(shí)現(xiàn)這一點(diǎn),因此可以使用新的狀態(tài)存儲(chǔ)模式。性能當(dāng)然,就性能而言,每前進(jìn)一步都將付出相應(yīng)的代價(jià)。但您完全可以相信,大多數(shù)情況下,使用 Inproc 依然是最佳選擇,其后依次是 StateServer 和 SqlServer。您自己應(yīng)該對(duì)應(yīng)用程序進(jìn)行測(cè)試,確保選定的選項(xiàng)可以達(dá)到您的性能目標(biāo)。ASP 和 ASP .NET 之間的共享狀態(tài)需要考慮的另外一個(gè)重要問題是,雖然應(yīng)用程序可以同時(shí)包含 ASP 和 ASP .NET 網(wǎng)頁(yè),但您無法共享固有 Session 或 Application 對(duì)象中存儲(chǔ)的狀態(tài)變量。可能需要將這些信息復(fù)制到這兩個(gè)系統(tǒng)中或提出其它自定義解決方案,才能完全遷移您的應(yīng)用程序。最好的情況是您未使用 Session 和 Application 對(duì)象。另一方面,如果您大量使用了這些對(duì)象,您需要一直小心謹(jǐn)慎,或許可以提出某種自定義的短期解決方案來共享狀態(tài)。與安全性有關(guān)的變化安全性是需要特別注意的另一個(gè)重要問題。下面簡(jiǎn)要介紹了 ASP .NET 安全性系統(tǒng)。有關(guān)安全性問題更完整的研究,請(qǐng)參見 ASP .NET 安全性文檔。ASP .NET 安全性主要受 web.config 文件中安全性部分的設(shè)置控制。ASP .NET 與 IIS 協(xié)同工作,為您的應(yīng)用程序提供完善的完全性模型。IIS 安全性設(shè)置是實(shí)際攜帶并應(yīng)用于 ASP .NET 應(yīng)用程序的少數(shù)幾個(gè)應(yīng)用程序設(shè)置,其攜帶和應(yīng)用方式與在 ASP .NET 中相似。當(dāng)然,在很多方面都得到了改進(jìn)。身份驗(yàn)證對(duì)于身份驗(yàn)證,ASP .NET 支持表 5 中所示的選項(xiàng)。表 5:ASP .NET 身份驗(yàn)證選項(xiàng)類型說明WindowsASP .NET 使用 Windows 身份驗(yàn)證。Forms基于 Cookie 的自定義登錄表單。Passport非 Microsoft 提供的 Passport Service。None不執(zhí)行身份驗(yàn)證。除新增加的 Passport 身份驗(yàn)證選項(xiàng)之外,其它選項(xiàng)都與 ASP 中的選項(xiàng)相同。例如,下列配置對(duì)應(yīng)用程序啟用基于 Windows 的身份驗(yàn)證。<configuration> <system.web> <authentication mode="Windows"/> </system.web></configuration>授權(quán)用戶通過身份驗(yàn)證后,將集中考慮允許他們?cè)L問哪些資源。在下例中,授予了“jkieley”和“jstegman”訪問權(quán)限,而其他所有人都被拒絕訪問。<authorization> <allow users="NORTHAMERICA\jkieley, REDMOND\jstegman"/> <deny users="*"/></authorization>模擬做為刷新程序,模擬是指這樣一個(gè)過程:對(duì)象以它所代表的實(shí)體的標(biāo)識(shí)執(zhí)行代碼。在 ASP 中,模擬允許您的代碼代表通過身份驗(yàn)證的用戶運(yùn)行。或者,用戶也可以通過特定標(biāo)識(shí)匿名運(yùn)行。默認(rèn)情況下,ASP .NET 不會(huì)針對(duì)每個(gè)請(qǐng)求進(jìn)行模擬。這一點(diǎn)與 ASP 不同。如果您依賴于這種功能,則需要在 web.config 文件中啟用它,如下所示:<identity> <impersonation enable = "true"/></identity>數(shù)據(jù)訪問遷移過程中,需要重點(diǎn)考慮的另一個(gè)關(guān)鍵問題是數(shù)據(jù)訪問。隨著 ADO .NET 的誕生,現(xiàn)在您具有了一種訪問數(shù)據(jù)的強(qiáng)有力的全新方法。由于數(shù)據(jù)訪問本身就是一個(gè)很大的主題,本文就不詳細(xì)討論了。大多數(shù)情況下,您可以像過去一樣繼續(xù)使用 ADO,但是我極力推薦您了解一下 ADO .NET,并通過它改善 ASP .NET 應(yīng)用程序中的數(shù)據(jù)訪問方法。準(zhǔn)備向 ASP .NET 遷移現(xiàn)在您已了解了可能會(huì)遇到的大多數(shù)問題,您可能會(huì)想:目前我需要做好哪些準(zhǔn)備工作以備將來最終遷移到 ASP .NET 呢?目前確實(shí)需要完成幾項(xiàng)工作,以確保將來的遷移過程順利進(jìn)行。其中的許多建議對(duì)您的 ASP 代碼大有益處,即使目前不打算向 ASP .NET 遷移。使用 Option Explicit這始終是一個(gè)不錯(cuò)的建議,但至今仍然有許多人沒有使用它。通過使用 Option Explicit,強(qiáng)制在 ASP 中聲明變量,您至少可以控制在何處定義每個(gè)對(duì)象以及如何使用變量。遷移到 ASP .NET 之后,我建議使用 Option Strict。在 Visual Basic .NET 中,默認(rèn)使用 Option Explicit,但是使用更具強(qiáng)制性的 Option Strict,可以確保所有變量都聲明為正確的數(shù)據(jù)類型。這樣做確實(shí)需要增加一些額外的工作,但從長(zhǎng)期考慮,您將發(fā)現(xiàn)還是很值得這樣做的。避免使用默認(rèn)屬性我們前面已討論過,不再允許使用默認(rèn)屬性。顯式訪問屬性并不是什么難事。它將增強(qiáng)代碼的可讀性,而且可以在將來節(jié)省您的時(shí)間。使用括號(hào)和 Call 關(guān)鍵字正如本文前面詳細(xì)討論過的,應(yīng)盡可能使用括號(hào)和 Call 語句。在 ASP .NET 中,將強(qiáng)制使用括號(hào),F(xiàn)在使用 Call 語句有助于您熟悉一些規(guī)則,為將來的工作打好基礎(chǔ)。避免嵌套的包含文件這一點(diǎn)可能說起來容易做起來難,但還是應(yīng)盡可能避免嵌套包含文件。我的意思是說,應(yīng)該努力避免在包含文件中包括其它包含文件。隨著時(shí)間的推移,可能會(huì)碰到的一種情況是,您的代碼不再依賴于在其它某處的包含文件中定義的全局變量,您需要訪問的原因僅僅是因?yàn)槠渲星短琢税嬲枰娜肿兞康牧硪粋(gè)文件。向 ASP .NET 遷移時(shí),您很有可能會(huì)將全局變量和程序遷移到類庫(kù)中,這種情況下,如果您清楚地了解每個(gè)對(duì)象的訪問位置,遷移起來就很容易。您不需要將一些對(duì)象移來移去,也不需要更改多個(gè)文件中相同的那些程序名稱。將實(shí)用函數(shù)合并到單個(gè)文件中遷移過程中的一個(gè)策略是將服務(wù)器端包含文件中包含的所有實(shí)用函數(shù)和代碼遷移到 Visual Basic 或 C# 類庫(kù)中。這樣,您最終可以將所有代碼放到所屬對(duì)象中,這一點(diǎn)與多解釋的 ASP 文件不同。提前組織好代碼,可以節(jié)省將來的遷移時(shí)間。理論上講,您應(yīng)該可以將子程序組合到邏輯文件中,從而使您可以輕松地創(chuàng)建一組 VB 或 C# 類。這些函數(shù)可能應(yīng)位于 COM 對(duì)象中。如果服務(wù)器端包含文件中存在一大堆全局變量或常量,也最好考慮將他們組合到單個(gè)文件中。一旦遷移到 ASP .NET 后,您就可以輕松創(chuàng)建一個(gè)類來存放全局或常量數(shù)據(jù)。這將使系統(tǒng)更干凈、更易維護(hù)。盡可能將代碼與內(nèi)容分開這又是一件說起來比做起來容易的工作,但是您應(yīng)該盡量將代碼與 HTML 內(nèi)容分開。清理一下主體中即有代碼、又有腳本的那些函數(shù)。這樣做使您處于非常有利的位置,可以充分利用代碼--無論怎么說,這是 ASP .NET 中的最佳模式。不要在 <% %> 塊聲明函數(shù)ASP .NET 不支持在 <% %> 塊聲明函數(shù)。應(yīng)該在 <script> 塊進(jìn)行聲明。有關(guān)此技術(shù)的示例,請(qǐng)參閱本文前面的結(jié)構(gòu)變化一節(jié)。避免使用生成函數(shù)如前所述,應(yīng)該盡量避免使用“生成函數(shù)”。如果現(xiàn)在可以更改或準(zhǔn)備代碼,應(yīng)在構(gòu)造這類函數(shù)時(shí)使用 Response.Write 塊。顯式釋放資源(調(diào)用 Close 方法)確保對(duì)使用的對(duì)象和資源中存在的 close() 或清理方法進(jìn)行顯式調(diào)用。我們都知道,Visual Basic 和 VBScript 在清理方面的容錯(cuò)能力很強(qiáng)。通常情況下,他們能夠立即清理對(duì)象。但遷移到 .NET 后,您將無法準(zhǔn)確掌握對(duì)象何時(shí)會(huì)被清理,就像您無法確定垃圾堆中的垃圾何時(shí)會(huì)被清理一樣。如果您能夠顯式清理和釋放資源,最好顯式地進(jìn)行清理和釋放。避免混用語言應(yīng)該盡量避免在同一網(wǎng)頁(yè)中混用服務(wù)器端 VBScript 和 JScript。一般而言,這是一種不太明智的編程方式。而且向 ASP .NET 遷移時(shí)還會(huì)存在問題,因?yàn)橛捎诓捎昧诵碌木幾g模式,每個(gè)網(wǎng)頁(yè)只要求一種內(nèi)嵌 <% %> 語言。但仍然可以使用過去的方式生成客戶端腳本?偨Y(jié)正如我們已經(jīng)了解的,在向 ASP .NET 遷移應(yīng)用程序之前,有許多問題需要考慮。我在此文中歸納了遷移前后會(huì)發(fā)生的大多數(shù)變化,這應(yīng)該能使您的遷移過程變得相對(duì)簡(jiǎn)單一些。如果您擁有一個(gè)大型站點(diǎn),完成此進(jìn)程之后,您可能會(huì)對(duì)遇到并修正了如此多的死代碼、無效代碼以及所有 Bug 而驚奇不已。另外,通常您還可以充分利用 ASP .NET 和 .NET 平臺(tái)中大量強(qiáng)大的新增功能。