日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

ASP 到 ASP.NET 的移植

 趨明 2012-02-20
foci 的Blog - 悠云藍(lán)天
 
作者: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ù)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多