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