概述ASP.NET狀態(tài)類型
提供了四種ASP.NET狀態(tài)類型:application,session,cookie,view。
Application狀態(tài)為應(yīng)用程序提供了一個全局的狀態(tài)。所有客戶都可以使用該狀態(tài)。從設(shè)計的角度來說,我們通常用Application來存儲一些標(biāo)準(zhǔn)的數(shù)據(jù)。同時,我們在使用它時要注意避免性能的降低,存儲的數(shù)據(jù)盡可能提供給客戶只讀的功能。
我們可以使用HttpApplication類的Application屬性來訪問Application狀態(tài),它返回一個 HttpApplicationState類的實例。這個類是一個對象集合,可以存儲任何類型的數(shù)據(jù),并以鍵/值對的形式存儲。一旦數(shù)據(jù)被存儲到狀態(tài)后,就不會刪除,除非應(yīng)用程序重新啟動或者被終止或回收。
我們可以在Global.asax的Application_Start函數(shù)中存儲數(shù)據(jù):
- void Application_Start(object src, EventArgs e)
- {
- int exp = 0;
- // population of dataset from ADO.NET query not shown
- // Cache DataSet reference
- Application["Experiment"] = exp;
- }
- 現(xiàn)在你可以在任意頁面下使用它:
- private void Page_Load(object src, EventArgs e)
- {
- int expr = Int32.Parse((Application["Experiment"]));
- }
于Application狀態(tài)對于所有客戶都是共享的,如果客戶只是讀取該數(shù)據(jù),則沒有什么問題,一旦要進(jìn)行寫操作,就不能保證線程的安全以及出現(xiàn)同步爭用的問題。我們可以使用HttpApplicationStateLock類,它派生于ReadWriteObjectLock類,它提供了讀/寫鎖的兩種屬性。在ASP.NET下,隱式地調(diào)用了AcquireWrite()和AcquireRead()方法以保證避免上面的問題。當(dāng)然,我們也可以顯示地使用Lock()和Unlock():
- private void Page_Load(object sender, System.EventArgs e)
- {
- Application.Lock();
- int expr = Int32.Parse((Application["Experiment"]));
- if (expr>=something)
- {
- //do something
- }
- Else
- {
- //do something else
- }
- Application.UnLock();
- //Some other thing goes here
- }
session,cookie,view狀態(tài)都是用來保存客戶端信息的ASP.NET狀態(tài)類型。它們之間又有什么區(qū)別呢?
Session狀態(tài)是在客戶登錄的時候創(chuàng)建的,它保存了客戶特定的信息,并以Session ID來標(biāo)識。當(dāng)一個新客戶訪問應(yīng)用程序時,先生成一個新的Session ID(或是Session Key),并為同一個客戶接下來的請求創(chuàng)建聯(lián)系。你可以在Session State中存儲任意類型的數(shù)據(jù),作為你的應(yīng)用,狀態(tài)被同一個進(jìn)程和AppDomain(App域)維護(hù)。Session State的特點是為每一個特定的客戶創(chuàng)建狀態(tài)以維護(hù)客戶的信息,這些狀態(tài)信息存儲在服務(wù)器端的默認(rèn)的會話狀態(tài)配置中。
- Session(“Value”) = expr ; // Storing the data into session object
- SomeFunction()
- {
- int expr = Int32.Parse(Session(“Value”));//Accessing from it
- if (expr>=something)
- {
- //do something
- }
- Else
- {
- //do something else
- }
- //Some other thing goes here
- }
既然Session State針對特定的客戶建立,通過它來識別客戶的請求。ASP.NET提供了一種加密機(jī)制和編碼算法生成自己的Session Key。這是非常必要的,因為知道了你的Session Key,就有權(quán)限訪問指定的頁面了。
在ASP.NET中生成Session Key的方法:
- byte[] sessionkey = new byte[15];
- //Generates a random number
- RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider ();
- rngkey.GetBytes (sessionkey);
- string clientsessionKey = SessionId.Encode (sessionkey);
但是Session和客戶端的Cookie是有關(guān)的,當(dāng)客戶關(guān)掉Cookie時,Session就失效了。不過在ASP.NET中可以在web.config中修改設(shè)置,使Session的傳遞脫離Cookie。方法是:
- <configuration>
- <system.web>
- <sessionState cookieless="true" />
- </system.web>
- </configuration>
對于Cookie大家并不陌生,每個Cookie存儲了多個名/值對,我們可以通過HttpCookie類的值集合來訪問它,也可以間接地通過類所提供的索引器訪問。Cookie在ASP.NET下的使用:
- protected void Page_Load(Object sender, EventArgs E)
- {
- int expr = 0;
- if (Request.Cookies["Expr"] == null)
- {
- // "Expr" cookie not set, set with this response
- HttpCookie cokExpr = new HttpCookie("Expr");
- cokExpr.Value = exprTextBox.Text;
- Response.Cookies.Add(cokExpr);
- expr = Convert.ToInt32(exprTextBox.Text);
- }
- else
- {
- // use existing cookie value...
- expr = Convert.ToInt32(Request.Cookies["Expr"].Value);
- }
- // use expr to customize page
- }
由于Cookie存儲的信息是放到客戶端的,用戶在訪問服務(wù)器端頁面時,必然在客戶端和服務(wù)器端之間頻繁交換信息,影響了程序的性能。而Session由于存儲在服務(wù)器內(nèi)存中,因此不存在這個問題。不過,Session存儲的信息是臨時的,用戶一旦關(guān)閉瀏覽器,狀態(tài)即失去,而Cookie則相反。以上介紹ASP.NET狀態(tài)類型
【編輯推薦】