李莉+森干
摘要:該文針對《ASP.NET程序設(shè)計》課程,介紹了動態(tài)網(wǎng)頁間傳值的不同方法,從生命周期、應(yīng)用范圍、數(shù)據(jù)集的大小和類型討論了這些方法的異同和優(yōu)缺點(diǎn),以期能夠讓學(xué)生掌握這些方法及其特點(diǎn),在實(shí)際應(yīng)用中能夠結(jié)合具體問題選擇有效的方法。
關(guān)鍵詞:ASP.NET;頁面?zhèn)髦?;QueryString;Application;Session;Cookie;Server.Transfer
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)33-0136-02
1 背景
《ASP.NET程序設(shè)計》課程是我校信息管理與信息系統(tǒng)專業(yè)的一門專業(yè)課,也是一門實(shí)踐型課程。其教學(xué)目的是培養(yǎng)學(xué)生掌握動態(tài)網(wǎng)站的設(shè)計、開發(fā)和編程能力,熟悉動態(tài)網(wǎng)站的開發(fā)流程,能自主開發(fā)一個簡單的動態(tài)網(wǎng)站,并進(jìn)行維護(hù)。這門課涉及的內(nèi)容豐富、知識點(diǎn)多,且知識的關(guān)聯(lián)性、實(shí)踐性和綜合性較強(qiáng)。要求授課教師不僅僅對課程內(nèi)容和教材熟悉,還要求有一定的軟件開發(fā)和設(shè)計的經(jīng)驗(yàn),通過項(xiàng)目驅(qū)動來覆蓋知識點(diǎn),并進(jìn)行拓展,確保知識的完整性。
例如,動態(tài)網(wǎng)站架構(gòu)時,如何實(shí)現(xiàn)瀏覽器和Web服務(wù)器之間的數(shù)據(jù)交互是非常重要的,其中選擇合適的方法實(shí)現(xiàn)頁面之間一個或多個參數(shù)的傳遞尤為關(guān)鍵。當(dāng)然,ASP.NET為頁面之間的數(shù)據(jù)傳遞提供了多種不同的途徑,我們可以使用QueryString、Application、Session、Cookie和Server.Transfer等變量及其方法來實(shí)現(xiàn),但是我們應(yīng)該什么時候使用哪種方法呢?本文針對這個問題進(jìn)行了探討,并對其進(jìn)行比較分析。
2 問題描述
首先我們將問題定義為:有兩個web頁面a.aspx和b.aspx,在a.aspx中有一個textbox1和button1,在b.aspx中有一個label1。運(yùn)行時,用戶在頁面a.aspx中的textbox1輸入信息后,如何實(shí)現(xiàn)單擊button1彈出b.aspx,并將textbox1中的值傳遞到label1中呢?
解決這個問題,需要考慮下面三個方面:
1)哪些用戶需要數(shù)據(jù)?
2)數(shù)據(jù)集的類型和大???
3)數(shù)據(jù)需要保持多長時間?
通過分析實(shí)際問題的需求,我們就可以決定應(yīng)該使用哪種方法為ASP.NET應(yīng)用程序之間請求數(shù)據(jù)提供最佳的解決方案。
3 解決方法及適用情況
下面我們基于C#來闡述解決上述問題的各種方法,及其生命周期和應(yīng)用范圍。
3.1 使用QueryString
QueryString集合檢索HTTP查詢字符串中變量的值,HTTP查詢字符串由問號(?)后的值指定。
QueryString是一種最簡單最常用的傳值方式,但被傳送的值會顯示URL中,對于用戶來說是可見的,因此使用這種方法時,需要對敏感數(shù)據(jù)變量進(jìn)行加密。其次,QueryString中保存的數(shù)據(jù)是由單獨(dú)的用戶使用,其大小一般1KB。其生命周期可能只有一個請求那么短,也可能有用戶使用應(yīng)用程序的時間那么長。因此,如果是傳遞一個或多個安全性要求不高或是結(jié)構(gòu)簡單的數(shù)值時,可以使用這個方法。
3.2 使用Application對象
Application可定義、聲明、設(shè)計“系統(tǒng)”層的變量、對象、事件處理過程,允許同一Web應(yīng)用程序的所有用戶共享其中的信息。默認(rèn)情況下,一個虛擬目錄下的所有ASP.NET文件便構(gòu)成了一個Web應(yīng)用程序。最常見的應(yīng)用就是網(wǎng)絡(luò)群聊,必須通過Application對象讓所有成員共享聊天信息及成員列表。
由于Application對象是多用戶共享的,在一個時間只有1個用戶使用,需對Application對象進(jìn)行鎖定(Lock),操作完成之后再解鎖(UnLock)。
3.3 使用Session對象
Session傳值也是常見的方式之一,與Application對象頗為類似,但Session對象是來定義、聲明、設(shè)計“用戶”層的變量、對象及事件處理過程,即Session對象的信息只適用于同一位用戶,其生存期是用戶持續(xù)請求的時間再加上一段時間,一般是20分鐘。當(dāng)用戶在不同頁面跳轉(zhuǎn)時,存儲在Session對象中的用戶會話的信息不會被清除,還可以交叉?zhèn)鬟f到多個頁面,直至把Session變量的值Removed后才會消失。例如購物車、購物袋等,每一個人的預(yù)購列表會存儲在各自的Session變量中,不和他人共享。
使用Sessions效率很低,因?yàn)榧词褂脩敉V故褂脩?yīng)用程序后它仍然保持在內(nèi)存中一段時間,這對于非常繁忙的站點(diǎn)的可伸縮性有嚴(yán)重的影響。
對于小的數(shù)據(jù)量,使用Sessions保存只需要在用戶當(dāng)前會中的特定數(shù)據(jù),是很好的方法。但是使用Sessions效率很低,因?yàn)楫?dāng)用戶停止使用應(yīng)用程序后,它仍然在內(nèi)存中保留一段時間,這會影響站點(diǎn)的響應(yīng)效率。
3.4 使用Cookie對象
Cookie提供了一條靈活的、強(qiáng)大的維護(hù)用戶會話信息的途徑,伴隨著用戶請求和頁面在 Web 服務(wù)器和瀏覽器之間傳遞。其生命周期可與瀏覽器窗體一樣短,也可長達(dá)數(shù)月、數(shù)年。
這個也是一種常用的方法,與Session一樣,是針對用戶而言的,但是有個本質(zhì)的區(qū)別:Cookie是存放在客戶端的,而session是存放在服務(wù)器端的。
由于cookie對象不是所有瀏覽器都支持的,而且cookie作為簡單的明文文本保存在用戶的計算機(jī)中,可以被用戶禁止或刪除,因此我們不能使用cookie保存敏感的、未加密的數(shù)據(jù),同時還要考慮cookie被刪除的情況。
3.5 使用Server.Transfer方法
使用Server.Transfer方法把流程從當(dāng)前頁面引導(dǎo)到另一個頁面中,新的頁面使用前一個頁面的應(yīng)答流,所以這個方法是完全面向?qū)ο蟮?,簡潔有效。注意Server.Transfer只適合于服務(wù)器端重定向的頁面。
4 結(jié)束語
本文主要從不同方法的應(yīng)用范圍、數(shù)據(jù)類型和大小、生命周期等四個指標(biāo)對常用的5種傳值方法進(jìn)行了討論、分析,見表1。
由此可見,每一種傳值方法都有其適用范圍和條件,都有不同的生命周期,所能處理數(shù)據(jù)的類型和大小也有所不同。因此,在實(shí)際的教學(xué)或開發(fā)應(yīng)用中,我們應(yīng)該對需求進(jìn)行仔細(xì)、全面的分析,考慮數(shù)據(jù)的類型、保密性,使用范圍和保持的時間,比較不同方法的應(yīng)用效果,權(quán)衡利弊,選擇合適的方法。
參考文獻(xiàn):
[1] 郭興峰, 陳建偉. ASP.NET動態(tài)網(wǎng)站開發(fā)基礎(chǔ)教程(C#篇)[M]. 北京: 清華大學(xué)出版社, 2006.
[2] 楊學(xué)全. Visual C#.NET Web應(yīng)用程序設(shè)計[M]. 北京: 電子工業(yè)出版社, 2007.