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