ADO+與資料控制元件
.NET Framework所提供的資料庫存取物件稱為ADO+(Active Data Object+),雖然有不少觀念與ADO相類似,但卻是全新的物件,為什麼已經有ADO了,還要再提供ADO+呢?筆者覺得原因可能有幾:
- 採用XML做為資料交換格式:由於XML已經成為網際網路交換資料的標準,這是個不得不的舉動。
- 延伸資料的範圍:在ADO底下,任何資料都必須透過OLD DB或ODBC來存取,ADO+ 並無此一限制,任何程式都可以藉助ADO+ 所提供的物件讓自己成為新資料格式的提供者,這因此延伸了可存取之資料的範圍。
- 與資料控制元件的整合:以往我們撰寫ASP網頁時,最不方便的地方是資料庫內容的顯示,為了顯示資料庫的內容,大概必須藉助ADO的Recordset物件逐筆讀取資料錄,然後再逐筆將其顯示出來,程式較冗長,在ASP.NET網頁中,我們只要佈置好DataGrid、DataList或Repeater這一類資料控制元件,然後與ADO+ 進行繫結,DataGrid等控制元件就會自動顯示資料庫的內容。參閱圖-5及圖-6就是分別使用DataGrid及DataList控制元件顯示資料庫內容的網頁。
圖-5 http://www.kjedu.com.tw/kjaspx/ch01/AspxPage.aspx 網頁
圖-6 http://www.kjedu.com.tw/kjaspx/ch01/DataList.aspx
Cache與效能的提升
為了提升執行效能,ASP.NET網頁會先被編譯成MSIL儲存在硬碟中,而下次當該網頁再度被瀏覽時,就可以直接執行被儲存下來的MSIL(細節請參閱「執行效能的質疑」段落的說明),除了此一強化執行效能的動作之外,ASP.NET所提供的Cache(快取記憶體)功能亦可提升執行效能。ASP.NET提供的Cache功能分成Output Cache及Data Cache兩種。
Output Cache與網頁快取
圖-7 Output Cache與網頁快取
參閱圖-7,所謂Output Cache,是在執行MSIL之後,先將結果寫入Output Cache,然後再將Output Cache下傳到瀏覽器,而將來如果瀏覽同一網頁,ASP.NET會先判斷該網頁是否有Output Cache存在,如果有,則直接將Output Cache下傳到瀏覽器,不會經過編譯 .aspx及執行MSIL的過程,故能提升執行效能。
要啟用Output Cache的方法十分簡單,只要在 .aspx網頁的最前面加上以下標示即可:
<% OutputCache Duration="秒數" %>
其中Duration表示Output Cache保留在系統中的秒數,例如:
<% OutputCache Duration="10" %>
結果網頁的Output Cache將會保留在系統中10秒鐘,而凡是在這10秒內瀏覽此一網頁,ASP.NET就會直接將Output Cache下傳給瀏覽器,省略了編譯的動作。
Data Cache與資料快取
除了將整個網頁儲存於Output Cache之外,我們也可以將局部資料儲存於Data Cache(以下簡稱Cache)。Cache的用法與Application物件很類似,例如:
' 將資料或物件存放在Application物件中
Application("key1") = "這是字串"
Application("key2") = obj
' 將資料或物件存放在Data Cache中
Cache("key1") = "這是字串"
Cache("key2") = obj
不過筆者必須說明的是Data Cache所佔用的記憶體隨時可能會被釋放(視系統記憶體當時使用的情況),所以每當我們要讀取Data Cache時,要先判斷Cache("key") 是否等於Nothing,若不等於Nothing,表示Cache("key") 還存在於系統中,方可讀取。
提供偵錯工具
在撰寫程式的過程中,難免會有錯誤產生,如何除錯對任何一個程式設計師來說,都是很重要而且是無可避免的工作。ASP的偵錯工具十分欠缺,為了改善此一缺失,ASP.NET提供以下幾種偵錯方法:
- 設定config.web的customerrors節區
- 使用追蹤(Trace)功能
- 偵錯工具程式(Debugger)
設定config.web的customerrors節區
當網頁產生錯誤而無法進一步編譯或執行時,ASP.NET會顯示如圖-8之畫面,此一畫面只告訴我們程式有錯,至於哪一行程式錯誤,則未顯示。為了讓ASP.NET顯示進一步的錯誤訊息,可在config.web檔案中增加customerrors節區的設定,如下:
<configuration>
<customerrors mode="off"/>
</configuration>
結果瀏覽之後可看到更詳細的錯誤指示畫面(如圖-9)
圖-8 ASP.NET網頁編譯或執行錯誤的畫面 (圖略)
圖-9 ASP.NET網頁編譯或執行錯誤的畫面(錯誤訊息較詳細)(圖略)
使用Trace追蹤功能
所謂Trace功能是在網頁的最前面加上以下標示:
<% Page Trace="True" %>
結果網頁被瀏覽之後,將會額外顯示一些資訊,如圖-10,而這些資訊有助於我們研判程式的狀況,做為偵錯時的參考。
圖-10 Trace功能啟用之後的網頁(圖略)
在圖-10畫面中,除了網頁正常顯示的內容之外,額外顯示的資訊可分成以下區段:
- Request Details:透過Request方式向瀏覽器所讀取之資料。
- Trace Information:事件發生或程式執行的過程。
- Control Tree:網頁所使用之控制元件及控制元件之間的階層關係。
- Cookies Collection:網頁所使用的Cookie。
- Headers Collection:瀏覽器的表頭資訊。
- Server Variables:Server變數,也就是我們可以透過Request. ServerVariables() 所讀取的資訊。
除了讓ASP.NET自動顯示以上訊息之外,我們也可以將程式執行過程中的資料顯示在Trace Information區段中,方法是呼叫Trace.Write或Trace.Warn,例如:
Trace.Write("UploadFile()", "進入UploadFile事件程序")
Trace.Warn ("UploadFile()", "進入For迴圈")
結果可將訊息輸出到Trace Information區段,供我們做為偵測程式的參考。
偵錯工具程式(Debugger)
ASP.NET提供的Debugger程式很像VB的操作介面,可以讓我們設定中斷點、逐步執行程式、觀察變數及堆疊的情況…等,是偵錯的利器。使用Debugger之前,須在config.web檔案中增加以下的設定:
<compilation debugmode="true"/>
接下來啟動C:\Program Files\Microsoft.Net\FrameworkSDK\GuiDebug目錄的DbgUrt.exe,然後利用以下步驟即可偵測 .aspx網頁:
1. 選取DbgUrt.exe功能表的「Debug -> Processes」,待出現「Processes」交談窗時,核取「Show system processes」及「Show processes in all sessions」,然後在「Available processes」欄位的最下面找到xspwp.exe(註:如果沒有看到xspwp.exe,請先啟動瀏覽器瀏覽任意 .aspx網頁,然後再按下「Refresh」鈕),選取之後,再按下「Attach」鈕,過程如圖-11。
圖-11 DbgUrt.exe的「Process」交談窗(圖略)
2. 接下來會出現「Attach to process」交談窗(如圖-12),請按下「OK」鈕。
圖-12 Attach to process 交談窗(圖略)
3. 接下來回到步驟1的「Processes」交談窗,請按下「Close」鈕。
4. 選取DbgUrt.exe功能表的「File -> Open -> File」選取您想偵測的 .aspx檔案,在此您可以選取多個想要偵測的檔案。
物件的開發
由於ASP.NET以VB7為程式語言,所以VB7所有物件導向的功能也都能夠發揮在ASP.NET網頁製作中,而除了程式語言所提供物件導向功能之外,ASP.NET可以開發一種網頁專用的物件 -- pagelet(網頁小配件)。
何謂Pagelet(網頁配件)?以生活中的實例來看,當我們裝飾耶誕樹時,往往會買些小配件,然後將它們佈置在喜歡的位置,Pagelet的觀念也是相類似的,某些常用的配件,我們可以將它們設計Pagelet,讓其他網頁來使用,舉個更實際的例子,例如我們網頁中佈置一個Label控制元件及一個TextBox控制元件,其作用就是在網頁中插入了一個Label類型的Pagelet及一個TextBox類型的Pagelet。
本文讓筆者先展示一個簡單的Pagelet,此一Pagelet命名為Footer.ascx,如下:(註:Pagelet須以 .ascx 為副檔名)
<Div align="right">
<Hr>
<A href="http://www.kj.com.tw" target="_top">
學 Visual Basic 找王國榮</A>
</Div>
檢視Footer.ascx的內容,您會發現其中只有HTML標示,完全沒有ASP.NET的程式,這樣的 .ascx檔案也能構成Pagelet嗎?答案是肯定的,最簡單的Pagelet就是只含有HTML標示的 .ascx檔案,接著讓我們來看看使用這個這個Pagelet的網頁UseFoot.aspx:
<% Register TagPrefix="kj" TagName="Footer" Src="Footer.ascx" %>
<Html>
<Body BgColor="White">
<H3>使用最簡單的 Pagelet -- UseFoot.aspx<HR></H3>
<Blockquote>
檢視 Footer.ascx 的內容,您會發現其中只有 HTML 標示,完全沒有
ASP+ 的程式,這樣的 .ascx 檔案也能構成 Pagelet 嗎?答案是肯定
的,最簡單的 Pagelet 就是只含有 HTML 標示的 .ascx 檔案。
</Blockquote>
<kj:Footer id="Footer1" runat="server"/>
</Body>
</Html>
網頁瀏覽的結果如圖-13。
圖-13 UseFoot.aspx瀏覽的結果
除了只含有HTML標示最簡單的Pagelet之外,Pagelet也可以含有屬性及方法,對於含有屬性及方法的Pagelet來說,其用法與Server控制元件完全相同。當我們覺得 .NET Framework 所提供的Server控制元件不夠用時,可以利用製作Pagelet的功能來建立我們自己的Server控制元件。
Web Services
不像ASP網頁只能存取本機資料庫,ASP.NET則提供了Web Services功能讓我們跨越網際網路存取遠端的資源。在VB6時代,微軟發表了RDS(Remote Data Service),也可以讓我們存取網際網路上另一部Server的資料庫,但它仍有兩大缺點:(1) 一般使用者上手不易 (2) 無法跨越平台:使用RDS跨越網際網路存取資料庫,不管Server端或Client端,都必須使用Windows作業系統。
Web Services(Web服務)改良了RDS的缺點,除了變得比較容易上手之外,Web Services採用XML為資料傳輸的格式,使得資料得以跨越平台,而更重要的是,ASP.NET網頁也可以享用這種服務,也可以提供這種服務。
在作業模式上,讓筆者舉個實例來說明,請參閱圖-14,假設瀏覽器會存取Server A的網頁,但Server A的資料庫來自ServerX,那麼Server X要提供一存取資料庫之Web Service,另一方面Server A則要建立Web資料庫代理程式,然後透過Web資料庫代理程式與Web Service的資料交換(採用XML格式),進而達到存取Server X資料庫的目的。
圖-14 存取Web資料庫(跨越網際網路的資料庫)
結語
也許過去兩三年電子商務真的被高估了,但網頁製作技術卻已成為資訊人必備的知識。雖然自從微軟發表IIS以來,ASP一直被低估了,所以只是IIS的附屬品,現在很高興ASP.NET終於從IIS之中獨立出來,而且功能與VB、C#…等程式語言看齊,相信未來的ASP網頁製作將進入另一個嶄新的世紀。