作者:foci 發(fā)表時(shí)間: 2006-10-24 19:28:55 更新時(shí)間: 2007-08-02 00:07:36 瀏覽:797次 主題:電腦技術(shù) 評(píng)論:0篇 地址:220.194.27.*
|
移植概述
安裝 ASP.NET 不會(huì)破壞現(xiàn)有的 ASP 應(yīng)用程序。它使用單獨(dú)的文件擴(kuò)展名(.aspx 而不是 .asp)、單獨(dú)的配置設(shè)置以及完全獨(dú)立的公共語(yǔ)言運(yùn)行庫(kù)(Asp.dll 沒(méi)有修改)。ASP 頁(yè)和應(yīng)用程序可以繼續(xù)使用現(xiàn)有的 ASP 引擎,不會(huì)受 ASP.NET 的干擾。這表明,將現(xiàn)有應(yīng)用程序移植到 ASP.NET 的好處是巨大的。ASP.NET 輕松提供比傳統(tǒng) ASP 多許多倍的功能,而且將 ASP 應(yīng)用程序移動(dòng)到新的平臺(tái)也提供了極大的改進(jìn)機(jī)會(huì)??梢岳玫男鹿δ馨ǎ?
提高的性能和可縮放性 網(wǎng)絡(luò)場(chǎng)支持和 XCopy 部署 輸出緩存和自定義安全 Web 窗體頁(yè)控件 XML Web 服務(wù)基礎(chǔ)結(jié)構(gòu) ASP.NET 旨在幫助您保留在傳統(tǒng) ASP 和 COM 技術(shù)上的投資。您希望支持現(xiàn)有的 ASP 語(yǔ)法和語(yǔ)義,同時(shí)需要可以很好地持續(xù)到下一代 Internet 應(yīng)用程序開(kāi)發(fā)的前瞻性平臺(tái),而 ASP.NET 正是在這兩者間實(shí)現(xiàn)平衡。盡管 ASP.NET 保留 ASP 功能集的多數(shù)內(nèi)容,但如果平臺(tái)要發(fā)展,就不可能實(shí)現(xiàn)二者間的完全兼容,因此對(duì)以往的工作方式有一些改動(dòng)。
好的方面是您的 ASP 技能可以很容易轉(zhuǎn)換為 ASP.NET。僅存在少數(shù)差異,通常很容易解決。但是,將 ASP 應(yīng)用程序移植到 ASP.NET 確實(shí)需要做一些工作。相對(duì)簡(jiǎn)單的頁(yè)可能不需更改即可移植,但較為復(fù)雜的應(yīng)用程序可能需要一些修改。以下各節(jié)描述這些更改,以及它們可能影響現(xiàn)有應(yīng)用程序代碼的方式。還說(shuō)明了一些可以在 ASP.NET 中重用 ASP 和 COM 代碼的方法。
語(yǔ)法和語(yǔ)義 ASP.NET 與傳統(tǒng)的 ASP 在 API 方面完全兼容,但有以下三處不同:
Request():ASP 返回字符串?dāng)?shù)組;ASP.NET 返回字符串。 Request.QueryString():ASP 返回字符串?dāng)?shù)組;ASP.NET 返回字符串。 Request.Form():ASP 返回字符串?dāng)?shù)組;ASP.NET 返回字符串。 在 ASP 中,Request、Request.QueryString 和 Request.Form 集合從查找返回字符串?dāng)?shù)組。例如,在傳統(tǒng)的 ASP 中,按如下所示訪問(wèn)從請(qǐng)求到 http://localhost/test/Test.asp?values=45&values=600 的查詢(xún)字符串值:
<% ' Below line outputs: "45, 600" Response.Write Request.QueryString("values")
' Below line outputs: "45" Response.Write Request.QueryString("values")(1) %>
在 ASP.NET 中,這些集合需要顯式方法來(lái)獲取數(shù)組訪問(wèn)。這些數(shù)組現(xiàn)在也是從 0 開(kāi)始索引。例如,在 ASP.NET 中,按如下所示訪問(wèn)從請(qǐng)求到 http://localhost/test/Test.aspx?values=45&values=600 的查詢(xún)字符串值:
<% // Below line outputs: "45, 600" Response.Write(Request.QueryString["values"]);
// Below line outputs: "45" Response.Write(Request.QueryString.GetValues("values")[0]); %>
<% ' Below line outputs: "45, 600" Response.Write(Request.QueryString("values"))
' Below line outputs: "45" Response.Write(Request.QueryString.GetValues("values")(0)) %>
<% // Below line outputs: "45, 600" Response.Write(Request.QueryString["values"]);
// Below line outputs: "45" Response.Write(Request.QueryString.GetValues("values")[0]); %>
C# VB JScript
這些數(shù)組最常用于從多項(xiàng)選擇列表框 (<select multiple>) 傳遞窗體值或多個(gè)復(fù)選框具有相同名稱(chēng)的情況。
ASP.NET 和 ASP 之間的語(yǔ)義差異 ASP.NET 頁(yè)與現(xiàn)有的 ASP 頁(yè)相比還有幾處語(yǔ)義變化。下列問(wèn)題最有可能影響您:
ASP.NET 頁(yè)僅支持單語(yǔ)言。 ASP 允許在單頁(yè)上使用多種語(yǔ)言,這對(duì)腳本庫(kù)方案有用。由于 ASP.NET 的已編譯特性,它在一頁(yè)上僅支持單語(yǔ)言。然而,在單個(gè)應(yīng)用程序內(nèi)仍然可以有多個(gè)使用不同語(yǔ)言的頁(yè)。用戶控件還可以具有不同于包含它們的頁(yè)所使用的語(yǔ)言。這使您能夠在單頁(yè)內(nèi)集成用不同語(yǔ)言編寫(xiě)的功能。這足以替代傳統(tǒng) ASP 應(yīng)用程序中普遍使用的多語(yǔ)言包含文件。
ASP.NET 頁(yè)函數(shù)必須在 <script runat=server> 塊中聲明。 在 ASP 中,頁(yè)函數(shù)可以在 <% %> 塊中聲明:
<% Sub DoSomething() Response.Write "Hello World!" End Sub
DoSomething %>
在 ASP.NET 中,頁(yè)函數(shù)必須在 <script runat=server> 塊中聲明:
<script language="C#" runat=server>
void DoSomething() { Response.Write("Hello World!"); }
</script>
<% DoSomething(); %>
<script language="VB" runat=server>
Sub DoSomething() Response.Write ("Hello World!") End Sub
</script>
<% DoSomething() %>
<script language="JScript" runat=server>
function DoSomething() : void { Response.Write("Hello World!"); }
</script>
<% DoSomething(); %>
C# VB JScript
ASP.NET 不支持頁(yè)呈現(xiàn)函數(shù)。 在 ASP 中,可以用 <% %> 塊聲明頁(yè)呈現(xiàn)函數(shù):
<% Sub RenderSomething() %> <font color="red"> Here is the time: <%=Now %> </font> <% End Sub %>
<% RenderSomething RenderSomething %>
在 ASP.NET 中,這必須重寫(xiě):
<script language="C#" runat=server>
void RenderSomething() { Response.Write("<font color=red> "); Response.Write("Here is the time: " + DateTime.Now); }
</script>
<% RenderSomething(); RenderSomething(); %>
<script language="VB" runat=server>
Sub RenderSomething() Response.Write("<font color=red> ") Response.Write("Here is the time: " & Now) End Sub
</script>
<% RenderSomething() RenderSomething() %>
<script language="JScript" runat=server>
function RenderSomething() : void { Response.Write("<font color=red> "); Response.Write("Here is the time: " + DateTime.Now); }
</script>
<% RenderSomething(); RenderSomething(); %>
C# VB JScript
本節(jié)小結(jié) 除了三處例外,ASP.NET 與傳統(tǒng)的 ASP 在 API 方面完全兼容。API 的變化是:Request()、Request.QueryString() 和 Request.Form() 現(xiàn)在都返回個(gè)別的字符串而不是字符串?dāng)?shù)組。 ASP.NET 頁(yè)僅支持單語(yǔ)言。 ASP.NET 頁(yè)函數(shù)必須在 <script runat=server> 塊中聲明。 不支持頁(yè)呈現(xiàn)函數(shù)。
語(yǔ)言兼容性 ASP 中使用的 VBScript 與 ASP.NET 中使用的 Visual Basic .NET 語(yǔ)言之間的差別是到目前為止所有潛在移植問(wèn)題中最廣泛的。在此發(fā)布版中,不僅 ASP.NET 從 VBScript 語(yǔ)言分離出來(lái)成為“真正的”Visual Basic,而且 Visual Basic 語(yǔ)言本身也經(jīng)歷了重大改變。這些改變旨在:
通過(guò)將具有相似用途的語(yǔ)言功能集中在一起,使語(yǔ)言更具一致性。 通過(guò)重新設(shè)計(jì)使 Visual Basic 不夠“基本”的功能來(lái)簡(jiǎn)化語(yǔ)言。 通過(guò)重新設(shè)計(jì)向程序員隱藏了太多重要細(xì)節(jié)的功能,提高可讀性和可維護(hù)性。 通過(guò)執(zhí)行更好的做法(如類(lèi)型安全編程)來(lái)提高可靠性。 本節(jié)重點(diǎn)介紹開(kāi)始使用新的 Visual Basic 語(yǔ)言時(shí)可能遇到的一些常見(jiàn)問(wèn)題。
不再使用 Set 和 Let,而是使用簡(jiǎn)單的變量賦值。 <% ' Old ASP syntax. Dim MyConn Set MyConn = Server.CreateObject("ADODB.Connection")
' New ASP.NET syntax. Dim MyConn MyConn = Server.CreateObject("ADODB.Connection") %>
不再使用非索引默認(rèn)屬性。非索引默認(rèn)屬性使通常引用對(duì)象的表達(dá)式能夠轉(zhuǎn)而引用對(duì)象的默認(rèn)屬性。支持默認(rèn)屬性的令人遺憾的結(jié)果是使程序更難讀,因?yàn)楸磉_(dá)式的含義取決于其上下文。在 Visual Basic .NET 中,非索引屬性必須始終在代碼中顯式指定。 <% ' Old ASP syntax (retrieving recordset column value). Set MyConn = Server.CreateObject("ADODB.Connection") MyConn.Open("TestDB") Set RS = MyConn.Execute("Select * from Products") Response.Write RS("Name")
' New ASP.NET syntax (retrieving recordset column value). MyConn = Server.CreateObject("ADODB.Connection") MyConn.Open("TestDB") RS = MyConn.Execute("Select * from Products") Response.Write RS("Name").Value %>
仍然支持索引默認(rèn)屬性:
<% Dim RS As RecordSet
' This is allowed (indexed). RS.Fields(1).Value = RS.Fields(2).Value
' But these are not allowed (non-indexed). RS(1) = RS(2) RS(1).Value = RS(2).Value %>
調(diào)用子例程現(xiàn)在需要使用括號(hào)。Visual Basic 現(xiàn)在支持與調(diào)用子例程和函數(shù)完全相同的語(yǔ)法。 ' Note parentheses with Response.Write. Sub DoSomething() Response.Write("Hello World!") End Sub
' Note parenthesws with DoSomething. DoSomething()
新默認(rèn)值是按值參數(shù)。 在 Visual Basic 6 中,如果用戶沒(méi)有在參數(shù)聲明中顯式指定 ByVal 或 ByRef,調(diào)用約定默認(rèn)為 ByRef。在新的 Visual Basic .NET 中,默認(rèn)值為 ByVal。這對(duì)常規(guī)參數(shù)(其默認(rèn)值通過(guò)顯式指定 ByRef 可重寫(xiě))和傳遞給 ParamArray 參數(shù)的參數(shù)(其默認(rèn)值不能重寫(xiě))都適用。但這已經(jīng)改變,因?yàn)楸冗@常見(jiàn)得多的做法是將參數(shù)僅用于將值傳入過(guò)程,而不是改變傳入的變量。將默認(rèn)值更改為 ByVal 可提高性能并減少意外副作用的可能性。 仍然可以通過(guò)顯式使用 ByRef 修飾符來(lái)使用按引用參數(shù):
<script language="VB" runat=server>
Sub DoSomething(ByRef value) value = 4343 End Sub
</script>
<% Dim number = 55 DoSomething (number) Response.Write ("Number: " & number) %>
注意: Visual Basic 6 和 Visual Basic .NET 之間還存在其他許多差異。請(qǐng)參考語(yǔ)言文檔以獲取更多信息。 本節(jié)小結(jié) ASP 中使用的 VBScript 與 ASP.NET 中使用的 Visual Basic .NET 語(yǔ)言之間的差別是到目前為止所有潛在移植問(wèn)題中最廣泛的。做了更改以簡(jiǎn)化語(yǔ)言并提高一致性、可讀性、可維護(hù)性和可靠性。 Visual Basic .NET 中不再支持 Set 和 Let 賦值。改為使用標(biāo)準(zhǔn)的變量賦值。 Visual Basic .NET 中不支持非索引默認(rèn)屬性。但仍然支持索引默認(rèn)屬性。 在 Visual Basic .NET 中調(diào)用子例程時(shí)需要使用括號(hào)。 新默認(rèn)值是按值參數(shù)。仍然可以通過(guò)顯式使用 ByRef 修飾符來(lái)使用按引用參數(shù)。
COM 互操作性 公共語(yǔ)言運(yùn)行庫(kù)使 .NET 對(duì)象能夠無(wú)縫地與傳統(tǒng)的 COM 組件相互操作。ASP.NET 向開(kāi)發(fā)人員公開(kāi)熟悉的 Server.CreateObject(ProgId) API 以創(chuàng)建 COM 的晚期綁定引用。 Dim myConn myConn = Server.CreateObject("ADODB.Connection");
也可通過(guò)創(chuàng)建運(yùn)行時(shí)可調(diào)用的包裝 (RCW)(該包裝優(yōu)化非托管代碼和托管代碼間的調(diào)用性能),使用早期綁定的傳統(tǒng) COM 組件??墒褂?.NET 框架 SDK 中包含的 Tlbimp.exe 實(shí)用工具創(chuàng)建 RCW。有關(guān) Tlbimp.exe 的更多信息,請(qǐng)參閱“常見(jiàn)任務(wù)入門(mén)”互操作性一節(jié)。ASP.NET 性能一節(jié)包含有關(guān)比較晚期綁定與早期綁定的更多信息。 同 ASP 一樣,也可以使用具有 progid 或 classid 屬性的 <object> 標(biāo)記來(lái)創(chuàng)建傳統(tǒng)的 COM 組件。除了可以在頁(yè)中使用 <object> 標(biāo)記外,還可以在應(yīng)用程序的 Global.asax 文件中使用該標(biāo)記。在這種情況下,將對(duì)象添加到 Page.Application.StaticObjects 集合,并且只需使用它的 id 屬性便可以編程方式訪問(wèn)它。注意,不能以靜態(tài)方式在 Global.asax 文件中創(chuàng)建單線程單元 (STA) 對(duì)象,因?yàn)檫@樣做會(huì)像在 ASP 中那樣發(fā)生運(yùn)行時(shí)錯(cuò)誤。
此外,ASP.NET 繼續(xù)支持現(xiàn)有的 ASP 內(nèi)部接口 ObjectContext Intrinsic Flow、OnStartPage 和 OnEndPage。支持這些接口意味著可以在 ASP.NET 頁(yè)中使用現(xiàn)有組件(Commerce Server、Exchange 等等)。默認(rèn)情況下不啟用這些接口,但可通過(guò)下列頁(yè)指令顯式打開(kāi)它們:
<%@ Page ASPCompat="true" %>
該指令使 ASP.NET 創(chuàng)建非托管的 ASP 內(nèi)部對(duì)象并將它們傳遞到頁(yè)中使用的 COM 組件。它還在 STA 線程池中運(yùn)行頁(yè)。有關(guān)信息,請(qǐng)參閱下節(jié)。
性能注意事項(xiàng) 在 ASP.NET 中,默認(rèn)情況下線程池是多線程單元 (MTA) 模式,這會(huì)影響傳統(tǒng)的單元線程 Visual Basic 5 和 Visual Basic 6 組件的性能。ASPCompat="true" 屬性使 STA 線程池能夠基于每頁(yè)解決現(xiàn)有 Visual Basic 組件的性能問(wèn)題。 在托管和非托管組件之間調(diào)用同樣會(huì)引起封送開(kāi)銷(xiāo),這將降低頁(yè)的性能。每種方案都會(huì)產(chǎn)生不同的性能特點(diǎn),因此在決定互操作性對(duì)應(yīng)用程序是否合適時(shí)進(jìn)行充分地測(cè)試是重要的。然而,幾乎在所有方案中,重寫(xiě)托管代碼中的 COM 組件都會(huì)帶來(lái)性能收益。有關(guān)更多信息和重要提示,請(qǐng)參閱 ASP.NET 性能一節(jié)。
本節(jié)小結(jié) ASP.NET 向開(kāi)發(fā)人員公開(kāi)熟悉的 Server.CreateObject API 以創(chuàng)建 COM 的晚期綁定引用。 也可通過(guò)創(chuàng)建運(yùn)行時(shí)可調(diào)用的包裝 (RCW)(該包裝優(yōu)化非托管代碼和托管代碼間的調(diào)用性能),使用早期綁定的傳統(tǒng) COM 組件。 ASP.NET 繼續(xù)支持現(xiàn)有的 ASP 內(nèi)部接口 ObjectContext Intrinsic Flow、OnStartPage 和 OnEndPage。這些接口通過(guò)頁(yè)指令 <%@ Page ASPCompat="true" %> 顯式啟用。 ASPCompat="true" 屬性使 STA 線程池能夠基于每頁(yè)解決現(xiàn)有 Visual Basic 組件的性能問(wèn)題。 幾乎在所有方案中,重寫(xiě)托管代碼中的 COM 組件都會(huì)提供性能收益。
MTS 事務(wù) 事務(wù)是以邏輯單元的形式成功或失敗的一個(gè)或一組操作。一個(gè)典型的事務(wù)例子是將資金從一個(gè)銀行帳戶轉(zhuǎn)移到另一個(gè)帳戶。此例中,必須將資金從第一個(gè)帳戶借記出來(lái),并貸記到第二個(gè)帳戶,這樣方可認(rèn)為操作成功。如果資金被成功地借記但沒(méi)有被貸記,則必須撤銷(xiāo)第一個(gè)帳戶上的借記,以使兩個(gè)帳戶都正確并一致。 一般通過(guò)聲明一組操作的邊界來(lái)管理事務(wù)。在事務(wù)邊界的上下文中執(zhí)行的操作于是以單元的形式成功或失敗。對(duì)于 ASP.NET,事務(wù)邊界是執(zhí)行對(duì)頁(yè)的單個(gè)請(qǐng)求,而該頁(yè)可能包含參與同一事務(wù)的嵌套組件。在頁(yè)執(zhí)行期間,如果頁(yè)本身上的操作或同一事務(wù)中的嵌套組件失敗,它可以調(diào)用 ContextUtil.SetAbort。它隨后由當(dāng)前的事務(wù)上下文獲取,整個(gè)事務(wù)失敗,并撤消任何已完成的操作。如果未發(fā)生失敗,則提交事務(wù)。
ASP.NET 事務(wù)支持由允許頁(yè)參與正在進(jìn)行的 Microsoft .NET 框架事務(wù)的能力組成。事務(wù)支持通過(guò)指示所需支持級(jí)別的 @Transaction 指令公開(kāi):
<%@ Transaction="Required" %>
下表定義了受支持的事務(wù)屬性。 缺少事務(wù)指令與“Disabled”的顯式指令相同。與 ASP 不同,ASP.NET 沒(méi)有對(duì)應(yīng)于 none 的顯式指令(即 Transaction="None")。
屬性 說(shuō)明 Required 頁(yè)要求事務(wù)。如果存在現(xiàn)有事務(wù),它在此事務(wù)的上下文中運(yùn)行。否則將啟動(dòng)一個(gè)事務(wù)。 RequiresNew 頁(yè)要求事務(wù),并為每個(gè)請(qǐng)求啟動(dòng)一個(gè)新的事務(wù)。 Supported 如果存在現(xiàn)有事務(wù),頁(yè)在此事務(wù)的上下文中運(yùn)行。否則將在無(wú)事務(wù)的情況下運(yùn)行。 NotSupported 頁(yè)不在事務(wù)范圍內(nèi)運(yùn)行。處理請(qǐng)求時(shí),無(wú)論是否存在活動(dòng)事務(wù),其對(duì)象上下文都在無(wú)事務(wù)的情況下創(chuàng)建。
可使用 System.EnterpriseServices.ContextUtil 類(lèi)的靜態(tài)方法顯式提交或中止事務(wù)。可顯式調(diào)用 SetComplete 或 SetAbort 方法提交或中止進(jìn)行中的事務(wù)。
注意:假設(shè)沒(méi)有其他對(duì)象與同一事務(wù)聯(lián)接,則事務(wù)將在頁(yè)的生存期結(jié)束時(shí)提交或中止,具體取決于最后調(diào)用的是 SetComplete 還是 SetAbort。
// Try to do something crucial to transaction completing. if (!DoSomeWork()) { ContextUtil.SetAbort(); }
' Try to do something crucial to transaction completing. If (Not DoSomeWork()) ContextUtil.SetAbort() End If
// Try to do something crucial to transaction completing. if (!DoSomeWork()) { ContextUtil.SetAbort(); }
C# VB JScript
本節(jié)小結(jié) 事務(wù)是以邏輯單元的形式成功或失敗的一個(gè)或一組操作。 ASP.NET 事務(wù)支持由允許頁(yè)參與正在進(jìn)行的 Microsoft .NET 框架事務(wù)的能力組成。事務(wù)支持通過(guò)指示所需支持級(jí)別的 @Transaction 指令公開(kāi)。 可使用 System.EnterpriseServices.ContextUtil 類(lèi)的靜態(tài)方法顯式提交或中止事務(wù)。開(kāi)發(fā)人員可顯式調(diào)用 SetComplete 或 SetAbort 方法來(lái)提交或中止進(jìn)行中的事務(wù)。 |