ASP.NET移植須知
http://www.webjx.com 更新日期:2005-02-24 10:33 出處:網(wǎng)頁(yè)教學(xué)網(wǎng) 作者:
雖然微軟ASP.NET的設(shè)計(jì)人員在ASP 應(yīng)用程序的向后兼容工作上做得相當(dāng)出色,在致力于把Web應(yīng)用程序從ASP遷至ASP.NET的時(shí)候,有幾點(diǎn)需要特別注意。切實(shí)理解由.NET平臺(tái)改變或引入的技術(shù)及ASP.NET,會(huì)使移植過程變得相對(duì)簡(jiǎn)單。
為增進(jìn)您對(duì)如何使ASP應(yīng)用程序在ASP .NET 環(huán)境中順利運(yùn)作的了解,本文著重探索了很多技術(shù)變化的方面。同時(shí),也指出一些ASP.NET中可被用來改進(jìn)現(xiàn)有應(yīng)用程序的新功能。這并不是一篇全面認(rèn)識(shí)ASP.NET新功能的文章。它主要涉及您所需要了解的實(shí)現(xiàn)成功移植的內(nèi)容。
既然大多ASP 應(yīng)用程序使用微軟Visual Basic? Scripting Edition (VBScript),我估計(jì)您們大多會(huì)選擇使用Visual Basic .NET移植到ASP.NET。這顯然并不是必要條件,但在決定移植的同時(shí)改變編程語言會(huì)需要一些額外的努力,而且很可能會(huì)要求設(shè)計(jì)上的改變。
共存
在我們開始討論具體的兼容與移植的問題前,您必須明白ASP與ASP.NET 如何共存。ASP與ASP.NET應(yīng)用程序可以在服務(wù)器上共同運(yùn)行而不互相排斥。這主要是因?yàn)檫@兩種技術(shù)使用的文件后綴(.asp versus .aspx)與配置模式(metabase/registry versus XML-based configuration files)都有所不同。兩種系統(tǒng)有著截然不同的處理引擎。
完全有可能使一應(yīng)用程序的一部分運(yùn)行ASP, 而它的另一部分運(yùn)行ASP.NET。 如果您需要從一個(gè)既龐大又變化非??斓恼军c(diǎn)逐步變?yōu)锳SP.NET,這一點(diǎn)就顯得非常重要了。有人也許會(huì)認(rèn)為一次性打包發(fā)布整個(gè)站點(diǎn)更好些。這對(duì)于Web應(yīng)用的某些類型也許適用,但我想很多現(xiàn)有的網(wǎng)站,由于其規(guī)模巨大,結(jié)構(gòu)復(fù)雜,網(wǎng)站內(nèi)容與形式的革新迅速,而不適用此法。畢竟,如果您的網(wǎng)站有利可圖,投資方恐怕十有八九會(huì)不斷地讓您加入新功能,而使您沒法轉(zhuǎn)向這個(gè)新的熱門技術(shù)中去。另外,如果您打算全力轉(zhuǎn)向ASP.NET,并把它當(dāng)成長(zhǎng)期投資,您會(huì)想利用這個(gè)機(jī)會(huì)盡可能的改進(jìn)結(jié)構(gòu)與設(shè)計(jì)。在這些情況下,用漸進(jìn)的方式實(shí)現(xiàn)共存是必需的。
兼容性問題
把您的應(yīng)用程序移植到ASP.NET也許并不容易;然而,也并不那么難。ASP.NET與ASP兼容性非常好。做到這點(diǎn)非常不容易,因?yàn)閺腁SP到ASP.NET是一場(chǎng)全新的變革。ASP.NET的設(shè)計(jì)者們?cè)瓉碛?jì)劃要做到100%與ASP兼容,但最終為了長(zhǎng)遠(yuǎn)考慮,出于優(yōu)化該平臺(tái)的目的,不得不收回計(jì)劃。您不用擔(dān)心,所有的變化都是往好的方向發(fā)展,不會(huì)在您安裝時(shí)造成很大工作量。綜合實(shí)際發(fā)生的變化,可以分為以下幾項(xiàng):
核心API 變化
結(jié)構(gòu)變化
Visual Basic語言變化
與COM 相關(guān)的變化
應(yīng)用程序配置的變化
狀態(tài)管理問題
涉及安全性問題
數(shù)據(jù)訪問
所有以上方面都會(huì)在下文中詳細(xì)討論。
核心API 變化
ASP的核心API由一些固有對(duì)象(Request, Response, Server, 等)及與它們相關(guān)的方法組成.除了一些簡(jiǎn)單變化,這些API在ASP.NET下會(huì)繼續(xù)工作無誤.所有的變化都與Request 對(duì)象有關(guān).請(qǐng)看表一:
表1:API 變化
Request(item)
在ASP中, 該方法會(huì)返回字符串?dāng)?shù)組.在ASP .NET,它會(huì)返回NameValueCollection.
Request.QueryString(item)
在ASP中, 該方法會(huì)返回字符串?dāng)?shù)組.在ASP .NET,它會(huì)返回NameValueCollection.
Request.Form(item)
在ASP中, 該方法會(huì)返回字符串?dāng)?shù)組.在ASP .NET,它會(huì)返回NameValueCollection.
可以看出, 這些變化對(duì)所有的方法都是一樣的。
如果,您要訪問的對(duì)象對(duì)某鍵值有唯一值,您就不需要修改您的代碼??墒牵绻卸鄠€(gè)值,您就需要用不同的方法獲得它們。另外,請(qǐng)注意Visual Basic .NET中的集合是以零為基的,而VBScript的集合是以一為基的。
例如,在ASP中,訪問來自對(duì)http://localhost/myweb/valuetest.asp?values=10&values=20發(fā)出的請(qǐng)求的單獨(dú)查詢字符竄數(shù)值,可能會(huì)得到以下結(jié)果:
<%
'This will output "10"
Response.Write Request.QueryString("values")(1)
'This will output "20"
Response.Write Request.QueryString("values")(2)
%>
在ASP .NET中,QueryString屬性返回NameValueCollection對(duì)象。從此對(duì)象中,您可以獲得數(shù)值集合,及您想要的真正內(nèi)容。再一次要強(qiáng)調(diào)的是:請(qǐng)注意集合中的第一項(xiàng)是基于零而不是一:
<%
'This will output "10"
Response.Write (Request.QueryString.GetValues("values")(0))
'This will output "20"
Response.Write (Request.QueryString.GetValues("values")(1))
%>
無論是ASP還是ASP.NET,以下代碼執(zhí)行結(jié)果是一樣的:
<%
'This will output "10", "20"
Response.Write (Request.QueryString("values"))
%>
結(jié)構(gòu)變化指的是那些影響Active Server Pages布局與代碼風(fēng)格的變化。您必須對(duì)它們有所了解以確保您的代碼會(huì)在ASP.NET中運(yùn)行無誤。
代碼塊: 聲明函數(shù)與變量
在ASP中,您可以在您的代碼標(biāo)示符中聲明子程序與全局變量.
<%
Dim X
Dim str
Sub MySub()
Response.Write "This is a string."
End Sub
%>
在ASP.NET中,這已被禁止。您必須在<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??!∧梢栽谕豁?yè)自由混合搭配腳本塊。
在ASP.NET,您現(xiàn)在有三種選擇。您可以使用C#, Visual Basic .NET, 或 Jscript。請(qǐng)注意我說的是Visual Basic .NET 而不是VBScript。這是因?yàn)閂BScript不存在于.NET 平臺(tái)。它已經(jīng)完全被Visual Basic .NET歸入。雖然您可以自由選擇任何語言,必須注意的是您不能再在同一頁(yè)任意混合不同語言。當(dāng)然您可以在您的應(yīng)用程序Page1.aspx中包含C#代碼,而Page2.aspx中包含Visual Basic .NET代碼。您所不能做的是把它們混合放在同一頁(yè)面。
新頁(yè)面指令
在ASP中,您必須把所有指示指令放在頁(yè)面的第一行, 而且只能在同一個(gè)代碼標(biāo)志符內(nèi)。例如:
<%LANGUAGE="VBSCRIPT" CODEPAGE="932"%>
在ASP.NET中,您必須把語言指令與頁(yè)面指令放在一行。例如:
<%@Page Language="VB" CodePage="932"%>
<%@QutputCache Duration="60" VaryByParam="none" %>
您可以根據(jù)需要,加入任意多條指令。指令可以被放在您的.apsx文件中的任何地方,但標(biāo)準(zhǔn)做法是置于文件開頭。
ASP .NET納入了一些新的指令。我建議您在ASP.NET相關(guān)文件中查找更多信息,看這些新指令是否能為您的應(yīng)用程序帶來益處。
Render 函數(shù)不再有效
在ASP中,開發(fā)人員發(fā)現(xiàn)它們可以利用所謂“輸出函數(shù)”做些聰明的事。輸出函數(shù)是一種正文中嵌入著大量HTML的子程序。例如:
<%Sub RenderMe()
%>
<H3> This is HTML text being rendered. </H3>
<%End Sub
RenderMe
%>
雖然用這些函數(shù)可以做很多很酷的事情,該代碼在ASP.NET中不再允許使用,這應(yīng)該是一種進(jìn)步。我相信,在您像這樣開始混合或搭配代碼與HTML時(shí),您見過有些函數(shù)很快就無法閱讀與管理了。讓它在ASP.NET中工作的最簡(jiǎn)單方法是調(diào)用 Response.Write 去取代您的HTML 輸出。例如:
<script language="vb" runat="server">
Sub RenderMe()
Response.Write("<H3> This is HTML text being rendered. </H3>")
End Sub
</script>
<%
Call RenderMe()
%>
請(qǐng)注意我說了:“最簡(jiǎn)單的方法”,這并不是說它是最好的方法。取決于您的輸出代碼的復(fù)雜程度與數(shù)量,使用自定義的Web controls可能對(duì)您有利。它使您可以用程序設(shè)置HTML屬性,并真正把您的內(nèi)容與代碼分開。這樣可以大大提高您的代碼可讀性。
正如我所提到過的,VBScript 已被更全面更強(qiáng)大的Visual Basic .NET所取代。在這部分,我會(huì)強(qiáng)調(diào)那些您可能會(huì)碰到的與Visual Basic語言變化相關(guān)的問題。請(qǐng)注意我并不會(huì)列出關(guān)于Visual Basic所有的變化,而只會(huì)著眼于一個(gè)由Visual Basic .NET轉(zhuǎn)向ASP .NET的ASP/VBScript 程序員可能會(huì)遇到的情況。欲知所有語言變化,請(qǐng)參考Visual Basic .NET相關(guān)文檔。
告別Variant數(shù)據(jù)類型
我們知道它,我們愛它,我們也恨它。我說的當(dāng)然是VARIANT數(shù)據(jù)類型。VARIANT數(shù)據(jù)類型不是.NET的一部分,所以在Visual Basic .NET中也不支持它。這也就意味著您所有的ASP變量正在不知不覺地從VARIANT數(shù)據(jù)類型轉(zhuǎn)為對(duì)象類型。您的應(yīng)用程序里的大多變量應(yīng)根據(jù)需要改為相應(yīng)的基元類型。如果您的變量在Visual Basic術(shù)語中確實(shí)是對(duì)象類型,只需在ASP.NET中簡(jiǎn)單聲明其為Object即可。
Visual Basic 數(shù)據(jù)類型
一種一定會(huì)引起特別關(guān)注的VARIANT是VT_DATE數(shù)據(jù)類型。在Visual Basic中它被表示為Date類型。在Visual Basic中,Date 是以4個(gè)字節(jié)的雙字節(jié)格式存儲(chǔ)的。在Visual Basic.NET中, Date使用Common Language Runtime DateTime 類型,用8?jìng)€(gè)字節(jié)整數(shù)來存儲(chǔ)。
既然在ASP中,所有變量都是VARIANT數(shù)據(jù)類型,您使用的Date變量會(huì)被編譯,也可能繼續(xù)工作(這取決于他們是如何被正確使用。)可是,您在使用這些變量時(shí),也有可能會(huì)遇到各種各樣的問題,因?yàn)樗鼈儗?shí)際的數(shù)據(jù)類型已經(jīng)改變。在把數(shù)值作為長(zhǎng)整數(shù)類型送入COM對(duì)象或是對(duì)日期類型用CLng實(shí)施某些轉(zhuǎn)換操作時(shí),尤要注意。
Option Explicit 現(xiàn)為默認(rèn)
在ASP中,Option Explicit 沒有被規(guī)定為默認(rèn)設(shè)置。Visual Basic .NET在這點(diǎn)上作了改變。Option Explicit成為默認(rèn)值,因此,所有變量都需要聲明。如果更嚴(yán)格一些的話,可以把您的設(shè)置變?yōu)镺ption Strict,這樣可以迫使您聲明所有的變量為某種數(shù)據(jù)類型。雖然這看似冗余,卻是您應(yīng)該堅(jiān)持的做法。如果您不這樣做,您的代碼遠(yuǎn)遠(yuǎn)不可能優(yōu)化,因?yàn)樗形唇?jīng)聲明的變量會(huì)變成Object 類型。大多數(shù)隱性轉(zhuǎn)換仍會(huì)有效,但如果您聲明清楚所有變量的話,以后您就可以更安心了。
LET 與 SET不再被支持
對(duì)象可以像這樣直接賦值:MyObj1 = MyObj2。如果您的程序里有SET 或LET 關(guān)鍵字, 它們必須被移掉。
用括號(hào)實(shí)現(xiàn)方法調(diào)用
在ASP中,您無須使用括號(hào)就可以自由調(diào)用對(duì)象的方法。例如:
Sub WriteData()
Response.Write "This is data"
End Sub
WriteData
在ASP .NET中, 做任何調(diào)用,您都必須使用括號(hào),即使是不使用任何參數(shù)的方法也是一樣。按照如下例所示方法書寫代碼,可以使代碼在ASP與 ASP.NET環(huán)境中都工作無誤。
Sub WriteData()
Response.Write("This is data")
End Sub
Call WriteData()
ByVal成為默認(rèn)
在Visual Basic中,所有參數(shù)默認(rèn)以引用(或ByRef)方式來傳遞。在Visual Basic .NET中有所改變。所有參數(shù)默認(rèn)以值(或ByVal)傳遞。如果您仍然希望以引用來傳遞,您必須在參數(shù)之前清楚注明ByRef關(guān)鍵字。例如:
Sub MyByRefSub (ByRef Value)
Value = 53;
End Sub
這就是您必須非常小心的地方。當(dāng)您將您的代碼轉(zhuǎn)向ASP.NET,我建議您對(duì)方法調(diào)用中的每個(gè)參數(shù)作兩次甚至三次的檢查,以確保這種變化確實(shí)符合您的期望。我估計(jì),在檢查過程中,總會(huì)查出些錯(cuò)誤。
不再有默認(rèn)屬性
默認(rèn)屬性的概念不再存在于Visual Basic .NET。 這也就意味著如果您有依賴于來自某對(duì)象的默認(rèn)屬性的ASP代碼,您將需要加以修改,以顯式地引用所需屬性。請(qǐng)見下例:
'ASP Syntax (Implicit retrieval of Column Value property)
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("TestDB")
Set RS = Conn.Execute("Select * from Products")
Response.Write RS("Name")
'ASP.NET Syntax (Explicit retrieval of Column Value property)
Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("TestDB")
RS = Conn.Execute("Select * from Products")
Response.Write (RS("Name").Value)
數(shù)據(jù)類型的變化
在Visual Basic .NET,整數(shù)值現(xiàn)在是32 位。Long數(shù)據(jù)類型為64 位。
當(dāng)從ASP.NET中調(diào)用COM對(duì)象的方法或是在您自定義Visual Basic components組件中調(diào)用Microsoft? Win32? API,都可能發(fā)生問題。您特別要注意實(shí)際需要的數(shù)據(jù)類型,以確保您正確傳遞數(shù)值。
結(jié)構(gòu)化的例外處理
雖然在Visual Basic .NET中,仍然沿用熟悉的On Error Resume Next 及On Error Goto 錯(cuò)誤處理方法,但是,它們不再是最好的方法。Visual Basic現(xiàn)在有成熟的,系統(tǒng)的例外處理方法。它們使用Try, Catch, 及 Finally等關(guān)鍵字。如果有可能的話,您應(yīng)該轉(zhuǎn)向這種新的錯(cuò)誤處理模式,因?yàn)樗\(yùn)用了一個(gè)性能更加完善,穩(wěn)定的機(jī)制來處理應(yīng)用程序錯(cuò)誤。
與前面介紹的.NET 框架與ASP.NET相比,COM基本沒有變化。但是,這并不是說您從ASP.NET上運(yùn)用它們時(shí),您完全不需要顧及COM對(duì)象及它們的行為。以下是幾點(diǎn)您必須注意的要素:
線程模式變化
ASP.NET線程模式是Multiple Threaded Apartment (MTA). 這就是說,您所用的為Single Threaded Apartment (STA)而生成的組件,在ASP.NET中,如不采取特別預(yù)防措施,不再會(huì)可靠工作。這包括,但不局限于,用Visual Basic 6.0及先前版本生成的所有COM組件。
ASPCOMPAT 屬性
現(xiàn)有的STA組件不需要任何修改就能使用。 您所要做的僅僅是在ASP.NET頁(yè)面的<%@Page>標(biāo)簽中加入指示兼容的屬性aspcompat=true。比如,<%@Page aspcompat=true Language=VB%>。使用這個(gè)屬性會(huì)強(qiáng)制該頁(yè)面在STA模式下執(zhí)行,從而確保您的組件正常工作。如果您的頁(yè)面不指定本屬性而直接引用STA組件,在運(yùn)行時(shí)將發(fā)生異常。
設(shè)置aspcompat=true也將使您的頁(yè)面能夠調(diào)用那些需要使用ASP內(nèi)建對(duì)象的COM+1.0組件。這可以通過ObjectConect對(duì)象來實(shí)現(xiàn)。
設(shè)置本屬性會(huì)導(dǎo)致一定的性能下降。我建議您僅在必要的情況下使用它。
預(yù)先綁定與滯后綁定
在ASP中,所有對(duì)COM組件的調(diào)用都是通過IDispatch接口進(jìn)行的。由于所有調(diào)用都需要在運(yùn)行時(shí)由IDispatch間接處理,我們稱之為滯后綁定。在ASP.NET中,如果您愿意,您仍然可以使用這種方式來完成對(duì)象調(diào)用。
Dim Obj As Object
Obj = Server.CreateObject("ProgID")
Obj.MyMethodCall
以上代碼能夠工作,但這并不是我們所推薦的用法。在ASP.NET中,您可以利用預(yù)先綁定直接創(chuàng)建您需要的對(duì)象:
Dim Obj As New MyObject
MyObject.MyMethodCall()
預(yù)先綁定能使您的頁(yè)面在與組件的交互過程中避免出現(xiàn)類型錯(cuò)誤。為了使用預(yù)先綁定,您需要在項(xiàng)目中加入一個(gè)引用,正如您在VB6.0項(xiàng)目中加入一個(gè)COM組件引用一樣。假設(shè)您使用的開發(fā)工具是Visual Studio.NET,VS.NET將會(huì)在后臺(tái)創(chuàng)建一個(gè)位于COM組件之上的代理對(duì)象,讓您感到就像在使用.NET組件一樣方便。
至此您可能會(huì)提出性能問題。為了保證與COM的互操作性,我們引入了代理對(duì)象,這的確會(huì)帶來一定的性能負(fù)擔(dān)。然而,在大多數(shù)情況下,您并不需要擔(dān)心由此而引發(fā)的性能下降。畢竟,與冗長(zhǎng)的IDispatch調(diào)用相比,代理對(duì)象所執(zhí)行的CPU指令幾乎可以忽略不計(jì)。您所贏得的遠(yuǎn)遠(yuǎn)超過您所失去的性能。當(dāng)然,理想的狀況是完全使用新創(chuàng)建的,被管理的(Managed)對(duì)象。然而,理想狀況近期還不可能達(dá)到——我們必須保護(hù)在過去幾年里對(duì)COM技術(shù)的投資。
OnStartPage和OnEndPage方法
在使用傳統(tǒng)的OnStartPage和OnEndPage方法問題上,您可能需要多花一些時(shí)間。如果您依賴于這兩個(gè)方法來訪問ASP固有對(duì)象,那么您需要使用ASPCOMPAT指令,然后用Server.CreateObject以預(yù)先綁定的方式來創(chuàng)建對(duì)象。見下例:
Dim Obj As MyObj
Obj = Server.CreateObject(MyObj)
Obj.MyMethodCall()
請(qǐng)注意我們沒有用“ProgID”,而是用了預(yù)先綁定的實(shí)際對(duì)象類型。為了保證以上代碼正常工作,您需要在Visual Studio項(xiàng)目中加入對(duì)該COM組件的引用,以便VS創(chuàng)建一個(gè)預(yù)先綁定的包裝類。這里是您必須繼續(xù)使用Server.CreateObject的唯一理由。
COM小結(jié)
表2列出了您為了繼續(xù)有效使用現(xiàn)有的COM組件所必須做的事情。
表2. 傳統(tǒng)COM對(duì)象的ASP.NET設(shè)置
COM 組件類型/方法
ASP .NET 設(shè)置/例程
Custom STA (Visual Basic 組件 或其它被標(biāo)志為"Apartment"的組件)
使用 ASPCOMPAT屬性, 和預(yù)先綁定
Custom MTA (或其它被標(biāo)志為"Both" or "Free" 的ATL 或自定義的 COM組件)
使用預(yù)先綁定,不當(dāng)?shù)灰?ASPCOMPAT屬性
內(nèi)置對(duì)象 (通過ObjectContext 對(duì)象來訪問)
使用 ASPCOMPAT屬性, 和預(yù)先綁定
OnStartPage, OnEndPage
使用 ASPCOMPAT屬性, 和Server.CreateObject(Type)
無論您的組件是否使用COM+來部署,以上設(shè)置都適用。
在ASP中,Web應(yīng)用程序的配置信息都存放在系統(tǒng)注冊(cè)表或IIS的配置數(shù)據(jù)庫(kù)(Metabase)中。在很多情況下,由于服務(wù)器缺乏適當(dāng)?shù)墓芾砉ぞ?,察看或修改這些設(shè)置成為非常困難的一項(xiàng)工作。ASP.NET引入了全新的,基于簡(jiǎn)單、可讀的XML文件的配置模式。ASP.NET應(yīng)用程序在自己的目錄下有一個(gè)Web.Config文件。您可以通過修改Web.Config文件來控制應(yīng)用程序的自定義配置,行為,和改變它的安全屬性。
由于習(xí)慣的作用,您可能像我一樣還是忍不住要打開Internet Service Manager來查看或修改ASP.NET應(yīng)用程序的配置。然而,您必須理解,我們現(xiàn)在有兩套獨(dú)立的配置模式。除了一些安全設(shè)置,絕大多數(shù)由IIS管理工具所生成的設(shè)置都會(huì)被ASP.NET應(yīng)用程序忽略。您需要把這些設(shè)置放在Web.Config文件里。
關(guān)于.NET應(yīng)用程序的設(shè)置有專門的文章討論,我這里不再贅述。表3列出了一些比較有趣的配置。請(qǐng)記住還有非常多的配置項(xiàng)目沒有列在這張表中。
表3. Web.Config 文件設(shè)置范例
項(xiàng)目
描述
<appSettings>
定制應(yīng)用程序配置
<authentication>
設(shè)定ASP.NET應(yīng)用程序?qū)ι矸蒡?yàn)證的支持
<pages>
設(shè)定頁(yè)面相關(guān)的配置
<processModel>
設(shè)置ASP.NET在IIS系統(tǒng)中的進(jìn)程模式
<sessionState>
指定一些會(huì)話狀態(tài)選項(xiàng)
.NET基本類庫(kù)中有一些類可以用來在程序中簡(jiǎn)化應(yīng)用程序配置訪問方式。
如果您的應(yīng)用程序使用了Session或Application固有對(duì)象來存儲(chǔ)狀態(tài)信息,那么它仍然能夠在ASP.NET中正確運(yùn)行。在ASP.NET中,您有了更多的選擇來存儲(chǔ)狀態(tài)相關(guān)的數(shù)據(jù)。
可用的狀態(tài)管理方法
ASP.NET提供了更多的狀態(tài)存儲(chǔ)摸式。這使您的應(yīng)用程序能夠跨越多個(gè)Web服務(wù)器支持Web farm范圍內(nèi)的狀態(tài)管理。
您可以用Web.Config文件中的<sessionState>部分來配置狀態(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"
/>
mode屬性指定了您想要存儲(chǔ)狀態(tài)信息的位置。您可以選擇的狀態(tài)包括Inproc, StateServer, SqlServer, 及Off。
表 4. 會(huì)話狀態(tài)存儲(chǔ)信息
選項(xiàng)
描述
Inproc
會(huì)話狀態(tài)存儲(chǔ)于服務(wù)器本地。(ASP 風(fēng)格)。
StateServer
會(huì)話狀態(tài)存儲(chǔ)于遠(yuǎn)程或本地的狀態(tài)服務(wù)進(jìn)程。
SqlServer
會(huì)話狀態(tài)存儲(chǔ)于SQL 服務(wù)器數(shù)據(jù)庫(kù)。
Off
會(huì)話狀態(tài)被關(guān)閉。
當(dāng)你選用StateServer狀態(tài),StateConnectionString 會(huì)起作用;而當(dāng)您使用SqlServer狀態(tài), sqlConnectionString會(huì)起作用。對(duì)于每個(gè)應(yīng)用程序,您僅可以使用一個(gè)存儲(chǔ)選項(xiàng)。
存儲(chǔ)COM組件
需要記住的一點(diǎn)是如果您依賴在您的Session 或Application對(duì)象中的傳統(tǒng)COM組件的存儲(chǔ)引用,您就不可以在應(yīng)用程序中使用新的狀態(tài)存儲(chǔ)機(jī)制(StateServer 或SqlServer)。您只能使用Inproc。這是因?yàn)樵?NET中, 那些對(duì)象需要能夠自我序列化, 但顯然COM 組件做不到. 相反, 您新創(chuàng)建的管理(Managed)組件可以相對(duì)容易實(shí)現(xiàn)這一點(diǎn),當(dāng)然也就可以使用新狀態(tài)存儲(chǔ)模式。
性能
提到性能,當(dāng)然沒有免費(fèi)可言??梢员WC的是,在大多數(shù)的情況下,Inproc會(huì)繼續(xù)保持其性能之最。緊隨其后的是StateServer和SqlServr。您應(yīng)當(dāng)用您的應(yīng)用程序進(jìn)行專門測(cè)試,以作出最符合您性能要求的選擇。
在ASP和ASP.NET中共享狀態(tài)
另一個(gè)應(yīng)當(dāng)注意的問題是雖然您的工具能夠容納ASP和ASP.NET網(wǎng)頁(yè),但是您不能共享固有會(huì)話或應(yīng)用對(duì)象的狀態(tài)變量。您可以將信息在兩個(gè)系統(tǒng)中進(jìn)行復(fù)制,也可以在您的應(yīng)用程序完全移植前,提供一個(gè)自定義的解決方法。底線是:如果您對(duì)Session和Application對(duì)象運(yùn)用很少,您不會(huì)受到很大影響。但就另一方面而言,如果您對(duì)這些對(duì)象運(yùn)用很多,您則需要謹(jǐn)慎的運(yùn)用。您或許可以考慮采自定義一個(gè)短期解決方法以共享狀態(tài)。
安全性是又一個(gè)值得關(guān)注的地方。這里提供的是對(duì)ASP.NET安全系統(tǒng)的簡(jiǎn)要概括。要獲得更詳盡的信息,請(qǐng)參閱ASP.NET安全系統(tǒng)的有關(guān)文件。
ASP .NET的安全性主要由web.config文件中的安全設(shè)置部分來控制。ASP .NET與IIS協(xié)調(diào)一致,緊密配合,為您的應(yīng)用程序提供一個(gè)完整的安全模式。一些極少數(shù)的IIS 安全性設(shè)置會(huì)以在ASP中同樣的方式被ASP.NET繼承和運(yùn)用。當(dāng)然,它還有許多附加的增強(qiáng)組件。
身份驗(yàn)證
對(duì)于身份驗(yàn)證,ASP.NET支持列表5中的不同選項(xiàng)。
列表5. ASP .NET 身份驗(yàn)證的選項(xiàng)
類型
描述
Windows
ASP .NET用Windows 身份驗(yàn)證.
Forms
基于Cookie,自定義登錄表.
Passport
微軟對(duì)外提供Passport 服務(wù).
None
沒有進(jìn)行身份驗(yàn)證
除了新的Passport 身份驗(yàn)證選項(xiàng)以外,這些選項(xiàng)在ASP中是相同的。以Windows為基礎(chǔ)的身份驗(yàn)證在以下例子中的配置下能得到運(yùn)用。
<configuration>
<system.web>
<authentication mode="Windows"/>
</system.web>
</configuration>
授權(quán)
當(dāng)您的用戶通過身份驗(yàn)證之后,您可以對(duì)希望他們?cè)L問的資源進(jìn)行授權(quán)。以下例子說明訪問權(quán)限被授予“jkieley”和“jstegman”,任何其他人都將被拒絕訪問。
<authorization>
<allow users="NORTHAMERICA\jkieley, REDMOND\jstegman"/>
<deny users="*"/>
</authorization>
扮演
扮演是指一個(gè)對(duì)象以另一個(gè)實(shí)體身份標(biāo)識(shí)來執(zhí)行代碼的過程. 在 ASP中, 扮演將允許您的代碼由授權(quán)用戶運(yùn)行.同樣的,您的用戶能夠在一個(gè)特殊的標(biāo)識(shí)下匿名運(yùn)行。在默認(rèn)情況下,ASP.NET對(duì)模擬并不是有求必應(yīng)。這與ASP是不同的。如果您依賴這個(gè)功能,您需要在您的web.config文件中,如下所示,激活該功能。
<identity>
<impersonation enable = "true"/>
</identity>
在移植時(shí)另一個(gè)要注意的關(guān)鍵是數(shù)據(jù)訪問。通過ADO.NET的介紹,您現(xiàn)在有了一個(gè)高效的新方法來獲取數(shù)據(jù)。因?yàn)閿?shù)據(jù)訪問就它本身而言是個(gè)很大的話題,所以它已超出了本文的范圍。對(duì)大多數(shù)情況而言,您能像以前一樣繼續(xù)使用ADO,但是我仍推薦您看一下ADO.NET。這是在您ASP.NET應(yīng)用程序中改進(jìn)數(shù)據(jù)訪問方法的一種有效途徑。
使用ASP .NET的準(zhǔn)備工作
現(xiàn)在您已知道了大多數(shù)您可能碰到的問題,您也許想知道在最終轉(zhuǎn)向ASP.NET之前的今天您該做些什么以做好準(zhǔn)備。為了讓過程更順利,有很多工作可以做。即使您將來不轉(zhuǎn)向ASP.NET,這里的許多建議對(duì)您的ASP代碼也是有幫助的。
使用Option Explicit
這是個(gè)很好的建議,但并不是每個(gè)人都使用它. 當(dāng)在ASP中使用Option Explicit來強(qiáng)制變量聲明時(shí), 您會(huì)至少清楚地了解所有內(nèi)容在哪里定義,及變量如何定義。一旦轉(zhuǎn)到ASP.NET, 我建議您使用Option Strict. Option Explicit 在Visual Basic.NET中是默認(rèn)的。 但是,如果使用更具強(qiáng)制性的Option Strict, 您就能確保所有的變量都被聲明為正確的數(shù)據(jù)類型. 雖然這勢(shì)必增添額外工作量,但是長(zhǎng)遠(yuǎn)看來,您將會(huì)發(fā)現(xiàn)這是很值得的。
避免使用默認(rèn)屬性
正如我們所討論的,默認(rèn)的屬性將不再被允許。訪問屬性原本就不是很困難的事。這會(huì)使您的代碼更具可讀性,同時(shí),將來移植時(shí)也會(huì)更節(jié)省時(shí)間.
使用括號(hào) 和Call關(guān)鍵字
就如本文前面所描述的一樣,應(yīng)盡可能的使用括號(hào)和Call 語句。 在 ASP .NET 中您將會(huì)被迫使用括號(hào)?,F(xiàn)在就使用Call語句助您早日養(yǎng)成優(yōu)良編程習(xí)慣,以更好的適應(yīng)將來的需求。
避免嵌套式包含文件
這點(diǎn)說來容易,做起來難。但是,您應(yīng)該盡可能地避免嵌套您的包含文件。說得更清楚一點(diǎn)就是, 您應(yīng)當(dāng)最大幅度避免重復(fù)嵌套文件。久而久之,往往發(fā)生的情況是,您的代碼不得不依賴于一個(gè)全局變量,而該變量又是在其他地方的包含文件中被定義。您能夠訪問它是因?yàn)槟哪硞€(gè)包含文件包含了這個(gè)您正真需要的包含文件。
當(dāng)您轉(zhuǎn)向ASP .NET,您將很有可能將您的全局變量和程序移入類庫(kù)中。這時(shí)如果您了解在哪里訪問所有內(nèi)容,就會(huì)方便很多。最后您也許不得不重新放置些文件,并改變一些重名例程的名字。
將功能函數(shù)組織成單個(gè)文件
在移植過程中的一個(gè)策略就是把功能函數(shù)和代碼轉(zhuǎn)移到Visual Basic 或C#類庫(kù)中。相對(duì)于多重解釋型的ASP文件,您最終可以把所有的代碼放進(jìn)它所屬的對(duì)象。提前組織您的代碼會(huì)節(jié)省您未來的時(shí)間。在最理想的狀態(tài)下,您應(yīng)該可以將子程序編組為邏輯文件。這樣您就能夠非常容易地創(chuàng)建一組VB或者C#類。這些功能在COM 對(duì)象中恐怕早就該有了。
如果在服務(wù)器端的包含文件中您有很多混合的全局變量或常數(shù),不妨將他們也放到一個(gè)文件中。一旦您轉(zhuǎn)向ASP.NET,您將能很容易的創(chuàng)建一個(gè)能容納您所有全局變量或常數(shù)的類。這樣您會(huì)有一個(gè)更有條理,更容易維護(hù)的系統(tǒng)。
盡可能地從內(nèi)容中移掉代碼
您應(yīng)盡可能的將您的代碼從HTML的內(nèi)容中分離開來,這是另一個(gè)易說難做的工作。把混有代碼和腳本的函數(shù)體清除出函數(shù)。這樣做的話,您就會(huì)跟好的實(shí)現(xiàn)代碼隱藏,因?yàn)檫@是一個(gè)ASP.NET下的理想模式。
請(qǐng)勿在<%%>塊中聲明函數(shù)
在ASP.NET中,這種寫法已經(jīng)不支持了。您應(yīng)該把您的函數(shù)聲明在<script>塊內(nèi)。請(qǐng)參考前面結(jié)構(gòu)變化部分中的例子。
避免輸出(Render) 函數(shù)
與先前討論的一樣,您應(yīng)該避免使用輸出函數(shù)。如果現(xiàn)在您能改變或準(zhǔn)備您的代碼,當(dāng)組建這些類型的函數(shù)時(shí),您應(yīng)該使用”Response.Write”語句塊。
明確地釋放資源 (調(diào)用Close方法)
請(qǐng)盡量明確地調(diào)用任何Close()或您所用對(duì)象與資源的釋放方法。就釋放而言,我們都知道Visual Basic 與VBScript會(huì)自動(dòng)釋放資源。它們一般都能立刻釋放資源,但是,當(dāng)我們轉(zhuǎn)向.NET,我們沒法確切地知道資源何時(shí)被釋放。所以您應(yīng)該盡可能顯示地釋放資源。
避免混合語言
如果有可能的話,您應(yīng)該避免在同一頁(yè)上混合服務(wù)器端的VBScript 與Jscript??偟膩碚f,混合不同語言的做法本來就是很糟糕的編程習(xí)慣。由于新的編譯模式的變化,每頁(yè)要求在<%%>塊內(nèi)只能有一種語言。這也是一個(gè)向ASP.NET 移植時(shí)要注意的問題。您可以繼續(xù)使用你習(xí)慣的方式編寫客戶端腳本。
總結(jié)
綜上所述,在您把您的應(yīng)用程序遷至ASP.NET時(shí),您需要注意相當(dāng)多的方面。我在本文中提出的大多變化應(yīng)該都是很容易實(shí)施的。
如果您的網(wǎng)站很大,當(dāng)您完成這一過程時(shí),您發(fā)現(xiàn)并修復(fù)的死代碼,低效程序,bug的數(shù)量,可能會(huì)多得足以讓您驚嘆。同時(shí),您將能充分享受ASP.NET 乃至整個(gè).NET平臺(tái)所帶來的眾多強(qiáng)大功能。