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