一起談.NET技術,ASP.NET的狀態管理

weixin_33912246發表於2011-09-01

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

<% @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資料庫中,但你也可以建立自己的配置檔案提供程式類,用於以自定義格式將配置檔案資料儲存到自定義儲存機制,

相關文章