詳解四個ASP.NET狀態(tài)
視圖狀態(tài):
視圖狀態(tài)就在大家身邊不知道大家是否注意。ASP.NET狀態(tài)是基于服務(wù)其處理事件的。當(dāng)服務(wù)器處理完事件時,再返回本窗體時,如果沒有視圖狀態(tài),原來的數(shù)據(jù)將不會在有。這樣說也許會暈。舉個列子,比如有一個網(wǎng)站需要你注冊成為會員。當(dāng)你填完信息,(一般來說頁面會轉(zhuǎn)向別的地方)這里為了說明問題,我們讓他返回原來的頁面繼續(xù)操作,如果沒有視圖狀態(tài),則你以前填的數(shù)據(jù)都沒有了。如果有視圖狀態(tài),則原來的數(shù)據(jù)還在。試圖狀態(tài)在一些時候很有用。比如說分級驗(yàn)證時。
那么.NET是用什么方法保持試圖狀態(tài)呢?這里微軟采用了一種特殊的方法。在瀏覽器打開網(wǎng)頁的源代碼,你會發(fā)現(xiàn)一段你在編輯網(wǎng)頁時,沒有添加的一個HTML控件。
這是.NET自動給你添加的。它也是視圖狀態(tài)能夠?qū)崿F(xiàn)的功臣。因?yàn)檫@個空間是隱藏的,所以不會破壞頁面的布局??占械膙alue中的值就是就是各個空件以及控件中的數(shù)據(jù)(狀態(tài))。這些數(shù)據(jù)是經(jīng)過哈希函數(shù)加密過的。這是為了安全考慮。當(dāng)網(wǎng)頁提交時,瀏覽器首先將當(dāng)前網(wǎng)頁中的各種狀態(tài)(包括控件以及控件中的數(shù)據(jù))保存到這個HTML字段中。當(dāng)網(wǎng)頁再次返回瀏覽器時,在自動把這些狀態(tài)返回給網(wǎng)頁,這樣網(wǎng)頁也就恢復(fù)了狀態(tài)。
再來講講視圖狀態(tài)需要注意的問題。
視圖狀態(tài)只能在本網(wǎng)頁與服務(wù)器之間保持,不能在不同網(wǎng)頁之間連接時保持。默認(rèn)情況下,幾乎所有的ASP.NET狀態(tài)都有保持視圖狀態(tài)的功能。
視圖狀態(tài)有很多優(yōu)點(diǎn),但同樣(世上每件事都具有兩面性,一個好的技術(shù)也不列外)有些缺點(diǎn)。首先是安全,雖然數(shù)據(jù)是經(jīng)過加密,但對于黑客中的骨灰級人物,還是很不安全的。再次,你可以想如果你的頁面包括幾百條記錄,頁面很復(fù)雜,這是必會影響網(wǎng)頁的加載速度。
應(yīng)用程序狀態(tài)(Application):
Application 對象是應(yīng)用程序的全局性對象。用于存放應(yīng)用程序的全局共享資源。他的本質(zhì)是HttpApplicationState類的一個實(shí)例。當(dāng)用戶第一次反問某虛目錄中的資源時,就被創(chuàng)建。也就是說網(wǎng)站第一次在互聯(lián)網(wǎng)上發(fā)布,這時有一個用戶剛好訪問你的虛擬目錄資源,那么Application對象就已經(jīng)建立。在資源與應(yīng)用程序之間建立了一個緩沖區(qū)。
應(yīng)用程序狀態(tài)只有在網(wǎng)站運(yùn)行時存在。當(dāng)應(yīng)用程序推出或服務(wù)器關(guān)閉時(更慘一點(diǎn)服務(wù)器崩潰了),應(yīng)用程序狀態(tài)中保存的數(shù)據(jù)機(jī)會丟失和損壞。所以對于需要永久保留的資源還是在數(shù)據(jù)庫中持久化保存的好。
介紹一些Application對象的一些操作方法。
Application對象當(dāng)然是采用最經(jīng)典的“鍵-值”對的字典方法來定義。其中鍵為字符串代表Application對象的名稱。值可以是任何類型的數(shù)據(jù)。(例如HTML,CSS,SQL都可以)。
會話狀態(tài)(Session):
Session對象用來保存單個用戶的狀態(tài)。在網(wǎng)站中,每個新訪問的用戶都將產(chǎn)生自己的會話(Session)對象。這個Session對象是在服務(wù)器端進(jìn)行管理,只能為它所綁定的用戶服務(wù)。如果另一位用戶也訪問網(wǎng)站,他也經(jīng)擁有自己的Sesiion對象。兩個用戶的Session對象即使同名,也不能共享同一個Session對象。各是各的。
實(shí)際上Session對象是HttpSessionState類的實(shí)例。有很多屬性和方法,大家不妨去看看。這里不闡述了。
應(yīng)用程序狀態(tài)在網(wǎng)站中總是可用的,這.NET Framework的內(nèi)部機(jī)制,我們不去管。我們來看看Session對象。由于在Machine.config配置文件中的Session設(shè)置是啟動的,因此不需要額外的步驟就能使用它。盡管如此我們還是要知道一些原理和本質(zhì)。Machine.config和應(yīng)用程序的Web.config中的設(shè)置決定了是啟動還是關(guān)閉Session對象。當(dāng)然如果想要延遲到需要時,在啟用也可以。我們可以在頁面一級設(shè)置。
這條語句的作用是在這個頁面中不能使用會話狀態(tài)(Session)。
Session對象有一個Timeout屬性可以設(shè)置Session對象的生命周期。它以分鐘為單位,默認(rèn)是20分鐘。如果再有效時間內(nèi)沒有連接服務(wù)器,那么Session的所有設(shè)置都將失效。如果需要終止Session對象,可以用它的Abandon()方法。
差點(diǎn)忘了,Session有一點(diǎn)很重要,補(bǔ)充一下。
session中的關(guān)鍵字是不區(qū)分大小寫的。因此不要用大小寫來區(qū)分Session變量。也就是說Session["source"]與Session["SOURCE"]是一樣的。如果刪掉其中一個,會有意想不到的結(jié)果。
Cookie狀態(tài):
Coolkie 狀態(tài)一是用來保存一個用戶資源的狀態(tài)。和Session不同的是它存儲在瀏覽器端。在Cookie中只能含有較少的信息,通常不超過4096個字節(jié)(有些較新的瀏覽器可以達(dá)到8192個i字節(jié)).在ASP.NET狀態(tài)中,Session 對象和Cookie對象現(xiàn)結(jié)合來識別用戶。每當(dāng)用戶開始連接站點(diǎn)時,系統(tǒng)將自動在內(nèi)存塊中創(chuàng)建一個和用戶有關(guān)的Session對象,同時創(chuàng)建一個 Cookie對象來保存用戶ID并把它保存在瀏覽器端,與當(dāng)前的用戶唯一的聯(lián)系起來。這樣當(dāng)用戶下一次在訪問時,用戶被要求提交用戶的TD也就是 CooKie,Cookie和Session相對照以正確的還原原來的會話狀態(tài)。這就是無狀態(tài)協(xié)議Http條件下保持用戶狀態(tài)的方法。
【編輯推薦】