歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

Session,Cookie,Application和ViewState這四者的有何區別


>>> 此貼的回復 >> 簡言之, ViewState是維護頁面狀態的 Application是維護Web應用程序狀態的,整個Web應用程序(站點/虛擬目錄)只有一個 Session是維護會話狀態的,每個客戶有一個——是用Cookie和服務器端的信息聯合實現的 具體的你看msdn吧

>>> 此貼的回復 >> Application狀態為應用程序提供了一個全局的狀態。所有客戶都可以使用該狀態。從設計的角度來說,我們通常用Application來存儲一些標准的數據。同時,我們在使用它時要注意避免性能的降低,存儲的數據盡可能提供給客戶只讀的功能。

我們可以使用HttpApplication類的Application屬性來訪問Application狀態,它返回一個HttpApplicationState類的實例。這個類是一個對象集合,可以存儲任何類型的數據,並以鍵/值對的形式存儲。一旦數據被存儲到狀態後,就不會刪除,除非應用程序重新啟動或者被終止或回收。

我們可以在Global.asax的Application_Start函數中存儲數據: 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; }

現在你可以在任意頁面下使用它:

private void Page_Load(object src, EventArgs e) { int expr = Int32.Parse((Application["Experiment"])); }

由於Application狀態對於所有客戶都是共享的,如果客戶只是讀取該數據,則沒有什麼問題,一旦要進行寫操作,就不能保證線程的安全以及出現同步爭用的問題。我們可以使用HttpApplicationStateLock類,它派生於ReadWriteObjectLock類,它提供了讀/寫鎖的兩種屬性。在ASP.Net下,隱式地調用了AcquireWrite()和AcquireRead()方法以保證避免上面的問題。當然,我們也可以顯示地使用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狀態都是用來保存客戶端信息的。它們之間又有什麼區別呢?

Session狀態是在客戶登錄的時候創建的,它保存了客戶特定的信息,並以Session ID來標識。當一個新客戶訪問應用程序時,先生成一個新的Session ID(或是Session Key),並為同一個客戶接下來的請求創建聯系。你可以在Session State中存儲任意類型的數據,作為你的應用,狀態被同一個進程和AppDomain(App域)維護。Session State的特點是為每一個特定的客戶創建狀態以維護客戶的信息,這些狀態信息存儲在服務器端的默認的會話狀態配置中。

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提供了一種加密機制和編碼算法生成自己的Session Key。這是非常必要的,因為知道了你的Session Key,就有權限訪問指定的頁面了。

在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是有關的,當客戶關掉Cookie時,Session就失效了。不過在ASP.Net 中可以在web.config中修改設置,使Session的傳遞脫離Cookie。方法是:

對於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存儲的信息是放到客戶端的,用戶在訪問服務器端頁面時,必然在客戶端和服務器端之間頻繁交換信息,影響了程序的性能。而Session由於存儲在服務器內存中,因此不存在這個問題。不過,Session存儲的信息是臨時的,用戶一旦關閉浏覽器,狀態即失去。而Cookie則相反。

至於View State,主要是指控件和頁面的狀態信息,它以_VIEWSTATE值傳遞給服務器端。有興趣的可以看我另外一篇文章:ASP.Net中控件的EnableViewState屬性

Application、Session和Cookie,可以借用Carfield的總結:

COOKIE 是本地文件,是 40 大盜在阿裡巴巴家做的記號,或者是送牛奶的人在你家門口釘的箱子。

SESSION 是服務器端內存,是你洗澡時浴池發給你的鑰匙。自己專用,可以開自己的好多箱子。

APPLICATION 是公共浴池。在這裡能看見所有人,包括 ppmm 哦:)。


Copyright © Linux教程網 All Rights Reserved