這些狀態的原理對於做NET開發非常重要現在詳細解說一下
視圖狀態視圖狀態就在大家身邊不知道大家是否注意ASPNET是基於服務其處理事件的當服務器處理完事件時再返回本窗體時如果沒有視圖狀態原來的數據將不會在有這樣說也許會暈舉個列子比如有一個網站需要你注冊成為會員當你填完信息(一般來說頁面會轉向別的地方)這裡為了說明問題我們讓他返回原來的頁面繼續操作如果沒有視圖狀態則你以前填的數據都沒有了如果有視圖狀態則原來的數據還在試圖狀態在一些時候很有用比如說分級驗證時
那麼NET是用什麼方法保持試圖狀態呢?這裡微軟采用了一種特殊的方法在浏覽器打開網頁的源代碼你會發現一段你在編輯網頁時沒有添加的一個HTML控件
形式是這樣的
<input type=
hidden
name=
_VIEWSTATE
id=
_VIEWSTATE
value=
一些加密過的值
/>
這是NET自動給你添加的它也是視圖狀態能夠實現的功臣因為這個空間是隱藏的所以不會破壞頁面的布局空件中的value中的值就是就是各個空件以及控件中的數據(狀態)這些數據是經過哈希函數加密過的這是為了安全考慮當網頁提交時浏覽器首先將當前網頁中的各種狀態(包括控件以及控件中的數據)保存到這個HTML字段中當網頁再次返回浏覽器時在自動把這些狀態返回給網頁這樣網頁也就恢復了狀態
再來講講視圖狀態需要注意的問題
視圖狀態只能在本網頁與服務器之間保持不能在不同網頁之間連接時保持默認情況下幾乎所有的ASPNET控件都有保持視圖狀態的功能
視圖狀態有很多優點但同樣(世上每件事都具有兩面性一個好的技術也不列外)有些缺點首先是安全雖然數據是經過加密但對於黑客中的骨灰級人物還是很不安全的再次你可以想如果你的頁面包括幾百條記錄頁面很復雜這是必會影響網頁的加載速度
應用程序狀態(Application):Application對象是應用程序的全局性對象用於存放應用程序的全局共享資源他的本質是HttpApplicationState類的一個實例當用戶第一次反問某虛目錄中的資源時就被創建也就是說網站第一次在互聯網上發布這時有一個用戶剛好訪問你的虛擬目錄資源那麼Application對象就已經建立在資源與應用程序之間建立了一個緩沖區
應用程序狀態只有在網站運行時存在當應用程序推出或服務器關閉時(更慘一點服務器崩潰了)應用程序狀態中保存的數據機會丟失和損壞所以對於需要永久保留的資源還是在數據庫中持久化保存的好
介紹一些Application對象的一些操作方法
Application對象當然是采用最經典的鍵值對的字典方法來定義其中鍵為字符串代表Application對象的名稱值可以是任何類型的數據(例如HTMLCSSSQL都可以)舉個例子
Application[source]=special source;string message =Application[source]ToString();
在Application中添加刪除保存的對象
ApplicationAdd(sourcespecial source);
Applicationremove(source);
來一個狠一點的操作把Application中的對象全部請出去
ApplicationClear();
或AppicationRemoveAll();
信息共享自然會引來一個問題資源的同步競爭這類問題解決當然要靠鎖了
ApplicatinLock()//加鎖鎖定資源不讓其他進程訪問
functions(Application[source]);//一些操作Application對象的操作
ApplicationUnLock();//解除鎖定
會話狀態(Session):Session對象用來保存單個用戶的狀態
在網站中
每個新訪問的用戶都將產生自己的會話(Session)對象
這個Session對象是在服務器端進行管理
只能為它所綁定的用戶服務
如果另一位用戶也訪問網站
他也經擁有自己的Sesiion對象
兩個用戶的Session對象即使同名
也不能共享同一個Session對象
各是各的
實際上Session對象是HttpSessionState類的實例有很多屬性和方法大家不妨去看看這裡不闡述了
就一些例子吧
Session[
source
]=
special source
;
string message =Session[
source
]
ToString();
應用程序狀態在網站中總是可用的這NET Framework的內部機制我們不去管我們來看看Session對象由於在Machineconfig配置文件中的Session設置是啟動的因此不需要額外的步驟就能使用它盡管如此我們還是要知道一些原理和本質Machineconfig和應用程序的Webconfig中的設置決定了是啟動還是關閉Session對象當然如果想要延遲到需要時在啟用也可以我們可以在頁面一級設置
//這條語句的作用是在這個頁面中不能使用會話狀態(Session)
Session對象有一個Timeout屬性可以設置Session對象的生命周期它以分鐘為單位默認是分鐘如果再有效時間內沒有連接服務器那麼Session的所有設置都將失效如果需要終止Session對象可以用它的Abandon()方法
差點忘了Session有一點很重要補充一下
session中的關鍵字是不區分大小寫的因此不要用大小寫來區分Session變量也就是說Session[source]與Session[SOURCE]是一樣的如果刪掉其中一個會有意想不到的結果
Cookie狀態: Coolkie 狀態一是用來保存一個用戶資源的狀態和Session不同的是它存儲在浏覽器端在Cookie中只能含有較少的信息通常不超過個字節(有些較新的浏覽器可以達到個i字節)在ASPNET中Session對象和Cookie對象現結合來識別用戶每當用戶開始連接站點時系統將自動在內存塊中創建一個和用戶有關的Session對象同時創建一個Cookie對象來保存用戶ID並把它保存在浏覽器端與當前的用戶唯一的聯系起來這樣當用戶下一次在訪問時用戶被要求提交用戶的TD也就是CooKieCookie和Session相對照以正確的還原原來的會話狀態這就是無狀態協議Http條件下保持用戶狀態的方法
向浏覽器寫入Cookie的方法是這樣的舉個例子
HttpCookie cookie=new HttpCookie(userNameId);//創建一個Cookie對象並且賦值cookieValue=userNameId//如果已經存在一Cookie也可以這樣給它賦值
cookieExpires=DateTimeNow+TimeSpan;//設定cookie的生命周期
這裡的TimeSpan是TimeSpan類的一個實例cookie的默認時間是分鐘
ResponseCookiesAdd(cookie);//向浏覽器中寫入Cookie
HttpCookie cookie=RequestCookies[cookie];//讀取Cookie
From:http://tw.wingwit.com/Article/program/net/201311/15574.html