作者: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)用程序。它使用單獨的文件擴展名(.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)機會。可以利用的新功能包括:
提高的性能和可縮放性 網(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ù)。 |