ASP.NET的狀態管理

 ASP.NET的狀態管理
 狀態時某一類型的數據在一定時期內保持活躍的信息。這裏說的一定時期可以使整個應用程序的生命週期,可以使用戶操作程序的時間,當然也可以是單個頁面的生命週期等。
 爲了解決傳統Web編程中固有的限制,ASP.NET提供了按頁面保留數據和在整個應用程序範圍內保留數據的功能,這些具體功能如下:
(其中1到5是以不同方式將數據存儲到客戶端上,6到8是將數據存儲到服務器上的內存中)
一、視圖狀態
ViewState屬性提供一個字典對象,用於在對同一頁的多個請求之間保留值。它是頁用來在往返行程之間保留頁和控件屬性值的默認方法。
當將頁面回發至服務器時,頁面會在頁的初始化階段分析視圖狀態字符串,和原頁中的屬性信息。也可以使用視圖狀態來存儲值。
視圖狀態提供了特定ASP.NET頁的狀態信息。如果需要在多個頁上使用信息,或者如果需要在訪問網站時保留信息,則應當使用另一個方法(如應用程序狀態、會話狀態或個性化設置)來維護狀態。
注意:視圖狀態信息將序列化爲XML,然後使用Base64編碼進行編碼,這將生成大量的數據。將頁回發到服務器時,視圖狀態的內容將作爲頁面回發信息的一部分發送。如果視圖狀態包含大量信息,則會影響頁的性能。
在某些情況下(如數據驅動頁在每次回發時從數據存儲區進行刷新),應當關閉視圖狀態以移除由數據控件(如GridView控件)生成的大量隱藏字段。
 換句話說,我們要儘量避免在前臺使用視圖狀態,如果可能的話,可以用input的控件,這樣可以提高網站的性能。
 存儲在視圖狀態中的數據類型 如下:字符串、整數、布爾值、Array對象、Arraylist對象、哈希表、自定義類型轉換器。
 使用視圖狀態具有以下3個優點:
一、耗費的服務器資源較少(與Application、Session相比):因爲,視圖狀態數據都寫入了客戶端計算機中 。
二、易於維護:在默認情況下.NET系統自動啓用對控件狀態數據的維護。
三、增強的安全功能:視圖狀態中的值經過哈希計算和壓縮,並且針對Unicode實現進行編碼,其安全性要高於使用隱藏域。
 使用視圖狀態具有以下3個缺點:
一、性能注意事項:如果存儲較大的值,用戶顯示頁和發送頁時的速度減慢。
二、設備限制:移動設備可能沒有足夠的內存容量來存儲大量的視圖狀態數據。
三、潛在的安全風險:視圖狀態存儲在頁上的一個或多個隱藏域中。雖然視圖狀態以哈希表格式存儲數據,但它可以被篡改。
 
 加密視圖狀態:在@ Page指令中,將ViewStateEncryptionMode屬性設置爲“Always”
<% @Page ViewStateEncryptionMode="Always" ...  %>

二、控件狀態
三、隱藏域
ASP.NET允許將信息存儲在HiddenField控件中,此控件將呈現爲一個標準的HTML隱藏域。隱藏域在瀏覽器中以不可見的形式呈現,但可以像對待標準控件一樣設置其屬性。
當向服務器提交頁面時,隱藏域的內容將在HTTP窗體集合中隨同其它控件的值一起發送。隱藏域可用作一個儲存庫,可以將存儲到頁中的任何特定於頁的信息放置其中。

四、客戶端Cookie
Cookie可以保存少量的數據,這些數據或者存儲在客戶端文件系統的文本本件中或者存儲在客戶端瀏覽器會話的內存中。
當瀏覽器請求某頁面時,客戶端會將Cookie中的信息連同請求信息一起發送。服務器可以讀取Cookie並提取它的值。
用法如下:
第一種存儲:
            //HttpCookie hc = new HttpCookie("user");// 創建Cookie對象
            //hc["Name"]=TextBox1.Text;
            //hc["Pwd"] = TextBox2.Text;
            //hc.Expires=DateTime.Now.AddDays(1);//設置Cookie的過期時間(在現在的時間上加,如果刪除,則加一個負數)
            //Response.Cookies.Add(hc);
第二種存儲:
            //直接指定Cookie對象
            //Response.Cookies["user"]["Name"] = TextBox1.Text;
            //Response.Cookies["user"]["Pwd"] = TextBox2.Text;
            //Response.Cookies["user"].Expires = DateTime.Now.AddDays(1);
(注:存儲時,都用的是Response)
接收時:用Request接收
        //if(Request.Cookies["user"]!=null)
        //{
        //    Response.Write("用戶名:"+Request.Cookies["user"]["Name"]+"<br/>");
        //    Response.Write("密碼:"+Request.Cookies["user"]["Pwd"]);
        //}

五、查詢字符串
查詢字符串是在頁面URL的結尾附加的信息。
查詢字符串提供了一種維護狀態信息的方法,這種方法很簡單,但是有使用上的限制。利用查詢字符串功能可以很容易地將信息從一個頁面傳送到另一個頁面。
用法如下:
傳遞時:在URL後加?
        if (Request.Form["TextBox1"] != "")
        {
            Response.Redirect("Main.aspx?username="+Request.Form["TextBox1"]);
        }
接收時:用Request
<%= Request["username"]%>

以下是基於服務器的狀態管理:
六、應用程序狀態
ASP.NET允許使用應用程序狀態來保存每個活動的Web應用程序的值,應用程序狀態是HttpApplicationState類的一個實例。
應用程序狀態存儲在一個鍵/值字典中,在每次請求一個特定的URL期間都會創建這樣一個字典。可以將特定於應用程序的信息添加到此結構以在頁請求期間存儲它。一旦將應用程序特定的信息添加到應用程序的狀態中,服務器就會管理該對象。

七、會話狀態(Session)
ASP.NET允許使用會話狀態保存每個活動的Web應用程序的會話值,會話狀態是HttpSessionState類的一個實例。
會話狀態與應用程序狀態相似,不同的是會話狀態的範圍限於當前的瀏覽器會話。如果有不同的用戶在使用應用程序,則每個用戶會話都將有一個不同的會話狀態。

八、配置文件屬性
ASP.NET提供了一個稱爲配置文件屬性的功能,可以存儲特定於用戶的數據。此功能與會話狀態類似,不同的是,在用戶的會話過期時,配置文件數據不會丟失。
若要使用配置文件屬性,必須對配置文件提供程序進行配置。ASP.NET包括一個SqlProfileProvider類,使你能夠將配置文件數據存儲到SQL數據庫中,但你也可以創建自己的配置文件提供程序類,用於以自定義格式將配置文件數據存儲到自定義存儲機制,
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章