ASP.NET移植須知
2024-07-10 12:58:31
供稿:網友
菜鳥學堂:
asp.net移植須知
統一教學網
日期:2001-11-5 9:05:00
出處:zdnet.com.cn
作者:未知
雖然微軟asp.net的設計人員在asp 應用程序的向后兼容工作上做得相當出色,在致力于把web應用程序從asp遷至asp.net的時候,有幾點需要特別注意。切實理解由.net平臺改變或引入的技術及asp.net,會使移植過程變得相對簡單。
為增進您對如何使asp應用程序在asp .net 環境中順利運作的了解,本文著重探索了很多技術變化的方面。同時 ,也指出一些asp.net中可被用來改進現有應用程序的新功能。這并不是一篇全面認識asp.net新功能的文章。它主要涉及您所需要了解的實現成功移植的內容。
既然大多asp 應用程序使用微軟visual basic® scripting edition (vbscript),我估計您們大多會選擇使用visual basic .net移植到asp.net。這顯然并不是必要條件,但在決定移植的同時改變編程語言會需要一些額外的努力,而且很可能會要求設計上的改變。
共存
在我們開始討論具體的兼容與移植的問題前,您必須明白asp與asp.net 如何共存。asp與asp.net應用程序可以在服務器上共同運行而不互相排斥。這主要是因為這兩種技術使用的文件后綴(.asp versus .aspx)與配置模式(metabase/registry versus xml-based configuration files)都有所不同。兩種系統有著截然不同的處理引擎。
完全有可能使一應用程序的一部分運行asp, 而它的另一部分運行asp.net。 如果您需要從一個既龐大又變化非常快的站點逐步變為asp.net,這一點就顯得非常重要了。有人也許會認為一次性打包發布整個站點更好些。這對于web應用的某些類型也許適用,但我想很多現有的網站,由于其規模巨大,結構復雜,網站內容與形式的革新迅速,而不適用此法。畢竟,如果您的網站有利可圖,投資方恐怕十有八九會不斷地讓您加入新功能,而使您沒法轉向這個新的熱門技術中去。另外,如果您打算全力轉向asp.net,并把它當成長期投資,您會想利用這個機會盡可能的改進結構與設計。在這些情況下,用漸進的方式實現共存是必需的。
兼容性問題
把您的應用程序移植到asp.net也許并不容易;然而,也并不那么難。asp.net與asp兼容性非常好。做到這點非常不容易,因為從asp到asp.net是一場全新的變革。asp.net的設計者們原來計劃要做到100%與asp兼容,但最終為了長遠考慮,出于優化該平臺的目的,不得不收回計劃。您不用擔心,所有的變化都是往好的方向發展,不會在您安裝時造成很大工作量。綜合實際發生的變化,可以分為以下幾項:
核心api 變化
結構變化
visual basic語言變化
與com 相關的變化
應用程序配置的變化
狀態管理問題
涉及安全性問題
數據訪問
所有以上方面都會在下文中詳細討論。
核心api 變化
asp的核心api由一些固有對象(request, response, server, 等)及與它們相關的方法組成.除了一些簡單變化,這些api在asp.net下會繼續工作無誤.所有的變化都與request 對象有關.請看表一:
表1:api 變化
request(item)
在asp中, 該方法會返回字符串數組.在asp .net,它會返回namevaluecollection.
request.querystring(item)
在asp中, 該方法會返回字符串數組.在asp .net,它會返回namevaluecollection.
request.form(item)
在asp中, 該方法會返回字符串數組.在asp .net,它會返回namevaluecollection.
可以看出, 這些變化對所有的方法都是一樣的。
如果,您要訪問的對象對某鍵值有唯一值,您就不需要修改您的代碼。可是,如果有多個值,您就需要用不同的方法獲得它們。另外,請注意visual basic .net中的集合是以零為基的,而vbscript的集合是以一為基的。
例如,在asp中,訪問來自對http://localhost/myweb/valuetest.asp?values=10&values=20發出的請求的單獨查詢字符竄數值,可能會得到以下結果:
<%
'this will output "10"
response.write request.querystring("values")(1)
'this will output "20"
response.write request.querystring("values")(2)
%>
在asp .net中,querystring屬性返回namevaluecollection對象。從此對象中,您可以獲得數值集合,及您想要的真正內容。再一次要強調的是:請注意集合中的第一項是基于零而不是一:
<%
'this will output "10"
response.write (request.querystring.getvalues("values")(0))
'this will output "20"
response.write (request.querystring.getvalues("values")(1))
%>
無論是asp還是asp.net,以下代碼執行結果是一樣的:
<%
'this will output "10", "20"
response.write (request.querystring("values"))
%>
結構變化指的是那些影響active server pages布局與代碼風格的變化。您必須對它們有所了解以確保您的代碼會在asp.net中運行無誤。
代碼塊: 聲明函數與變量
在asp中,您可以在您的代碼標示符中聲明子程序與全局變量.
<%
dim x
dim str
sub mysub()
response.write "this is a string."
end sub
%>
在asp.net中,這已被禁止。您必須在<script> 塊中聲明所有函數與變量。
<script language = "vb" runat = "server">
dim str as string
dim x, y as integer
function add(i as integer, j as integer) as integer
return (i + j)
end function
</script>
編程語言混合
在asp編程語言中,您基本上有兩種選擇:vbscript 或 microsoft® jscript®。 您可以在同一頁自由混合搭配腳本塊。
在asp.net,您現在有三種選擇。您可以使用c#, visual basic .net, 或 jscript。請注意我說的是visual basic .net 而不是vbscript。這是因為vbscript不存在于.net 平臺。它已經完全被visual basic .net歸入。雖然您可以自由選擇任何語言,必須注意的是您不能再在同一頁任意混合不同語言。當然您可以在您的應用程序page1.aspx中包含c#代碼,而page2.aspx中包含visual basic .net代碼。您所不能做的是把它們混合放在同一頁面。
新頁面指令
在asp中,您必須把所有指示指令放在頁面的第一行, 而且只能在同一個代碼標志符內。例如:
<%language="vbscript" codepage="932"%>
在asp.net中,您必須把語言指令與頁面指令放在一行。例如:
<%@page language="vb" codepage="932"%>
<%@qutputcache duration="60" varybyparam="none" %>
您可以根據需要,加入任意多條指令。指令可以被放在您的.apsx文件中的任何地方,但標準做法是置于文件開頭。
asp .net納入了一些新的指令。我建議您在asp.net相關文件中查找更多信息,看這些新指令是否能為您的應用程序帶來益處。
render 函數不再有效
在asp中,開發人員發現它們可以利用所謂“輸出函數”做些聰明的事。輸出函數是一種正文中嵌入著大量html的子程序。例如:
<%sub renderme()
%>
<h3> this is html text being rendered. </h3>
<%end sub
renderme
%>
雖然用這些函數可以做很多很酷的事情,該代碼在asp.net中不再允許使用,這應該是一種進步。我相信,在您像這樣開始混合或搭配代碼與html時,您見過有些函數很快就無法閱讀與管理了。讓它在asp.net中工作的最簡單方法是調用 response.write 去取代您的html 輸出。例如:
<script language="vb" runat="server">
sub renderme()
response.write("<h3> this is html text being rendered. </h3>")
end sub
</script>
<%
call renderme()
%>
請注意我說了:“最簡單的方法”,這并不是說它是最好的方法。取決于您的輸出代碼的復雜程度與數量,使用自定義的web controls可能對您有利。它使您可以用程序設置html屬性,并真正把您的內容與代碼分開。這樣可以大大提高您的代碼可讀性。
正如我所提到過的,vbscript 已被更全面更強大的visual basic .net所取代。在這部分,我會強調那些您可能會碰到的與visual basic語言變化相關的問題。請注意我并不會列出關于visual basic所有的變化,而只會著眼于一個由visual basic .net轉向asp .net的asp/vbscript 程序員可能會遇到的情況。欲知所有語言變化,請參考visual basic .net相關文檔。
告別variant數據類型
我們知道它,我們愛它,我們也恨它。我說的當然是variant數據類型。variant數據類型不是.net的一部分,所以在visual basic .net中也不支持它。這也就意味著您所有的asp變量正在不知不覺地從variant數據類型轉為對象類型。您的應用程序里的大多變量應根據需要改為相應的基元類型。如果您的變量在visual basic術語中確實是對象類型,只需在asp.net中簡單聲明其為object即可。
visual basic 數據類型
一種一定會引起特別關注的variant是vt_date數據類型。在visual basic中它被表示為date類型。在visual basic中,date 是以4個字節的雙字節格式存儲的。在visual basic.net中, date使用common language runtime datetime 類型,用8個字節整數來存儲。
既然在asp中,所有變量都是variant數據類型,您使用的date變量會被編譯,也可能繼續工作(這取決于他們是如何被正確使用。)可是,您在使用這些變量時,也有可能會遇到各種各樣的問題,因為它們實際的數據類型已經改變。在把數值作為長整數類型送入com對象或是對日期類型用clng實施某些轉換操作時,尤要注意。
option explicit 現為默認
在asp中,option explicit 沒有被規定為默認設置。visual basic .net在這點上作了改變。option explicit成為默認值,因此,所有變量都需要聲明。如果更嚴格一些的話,可以把您的設置變為option strict,這樣可以迫使您聲明所有的變量為某種數據類型。雖然這看似冗余,卻是您應該堅持的做法。如果您不這樣做,您的代碼遠遠不可能優化,因為所有未經聲明的變量會變成object 類型。大多數隱性轉換仍會有效,但如果您聲明清楚所有變量的話,以后您就可以更安心了。
let 與 set不再被支持
對象可以像這樣直接賦值:myobj1 = myobj2。如果您的程序里有set 或let 關鍵字, 它們必須被移掉。
用括號實現方法調用
在asp中,您無須使用括號就可以自由調用對象的方法。例如:
sub writedata()
response.write "this is data"
end sub
writedata
在asp .net中, 做任何調用,您都必須使用括號,即使是不使用任何參數的方法也是一樣。按照如下例所示方法書寫代碼,可以使代碼在asp與 asp.net環境中都工作無誤。
sub writedata()
response.write("this is data")
end sub
call writedata()
byval成為默認
在visual basic中,所有參數默認以引用(或byref)方式來傳遞。在visual basic .net中有所改變。所有參數默認以值(或byval)傳遞。如果您仍然希望以引用來傳遞,您必須在參數之前清楚注明byref關鍵字。例如:
sub mybyrefsub (byref value)
value = 53;
end sub
這就是您必須非常小心的地方。當您將您的代碼轉向asp.net,我建議您對方法調用中的每個參數作兩次甚至三次的檢查,以確保這種變化確實符合您的期望。我估計,在檢查過程中,總會查出些錯誤。
不再有默認屬性
默認屬性的概念不再存在于visual basic .net。 這也就意味著如果您有依賴于來自某對象的默認屬性的asp代碼,您將需要加以修改,以顯式地引用所需屬性。請見下例: