Application狀態
Application狀態為應用程序提供了一個全局的狀態所有客戶都可以使用該狀態從設計的角度來說我們通常用Application來存儲一些標准的數據同時我們在使用它時要注意避免性能的降低存儲的數據盡可能提供給客戶只讀的功能
我們可以使用HttpApplication類的Application屬性來訪問Application狀態它返回一個HttpApplicationState類的實例這個類是一個對象集合可以存儲任何類型的數據並以鍵/值對的形式存儲一旦數據被存儲到狀態後就不會刪除除非應用程序重新啟動或者被終止或回收
我們可以在Globalasax的Application_Start函數中存儲數據
void Application_Start(object src EventArgs e)
{
int exp = ;
// population of dataset from ADONET query not shown
// Cache DataSet reference
Application[Experiment] = exp;
}
現在你可以在任意頁面下使用它
private void Page_Load(object src EventArgs e)
{
int expr = IntParse((Application[Experiment]));
}
由於Application狀態對於所有客戶都是共享的如果客戶只是讀取該數據則沒有什麼問題一旦要進行寫操作就不能保證線程的安全以及出現同步爭用的問題我們可以使用HttpApplicationStateLock類它派生於ReadWriteObjectLock類它提供了讀/寫鎖的兩種屬性在ASPNet下隱式地調用了AcquireWrite()和AcquireRead()方法以保證避免上面的問題當然我們也可以顯示地使用Lock()和Unlock()
private void Page_Load(object sender SystemEventArgs e)
{
ApplicationLock();
int expr = IntParse((Application[Experiment]));
if (expr>=something)
{
//do something
}
Else
{
//do something else
}
ApplicationUnLock();
//Some other thing goes here
}
sessioncookieview狀態
sessioncookieview狀態都是用來保存客戶端信息的它們之間又有什麼區別呢?
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 = IntParse(Session(Value));//Accessing from it
if (expr>=something)
{
//do something
}
Else
{
//do something else
}
//Some other thing goes here
}
既然Session State針對特定的客戶建立通過它來識別客戶的請求AspNet提供了一種加密機制和編碼算法生成自己的Session Key這是非常必要的因為知道了你的Session Key就有權限訪問指定的頁面了
在ASPNet中生成Session Key的方法
byte[] sessionkey = new byte[];
//Generates a random number
RNGCryptoServiceProvider rngkey = new RNGCryptoServiceProvider ();
rngkeyGetBytes (sessionkey);
string clientsessionKey = SessionIdEncode (sessionkey);
但是Session和客戶端的Cookie是有關的當客戶關掉Cookie時Session就失效了
不過在ASPNet
中可以在nfig中修改設置使Session的傳遞脫離Cookie方法是
<configuration>
<systemweb>
<sessionState cookieless=true />
</systemweb>
</configuration>
對於Cookie大家並不陌生每個Cookie存儲了多個名/值對我們可以通過HttpCookie類的值集合來訪問它也可以間接地通過類所提供的索引器訪問Cookie在ASPNet下的使用
protected void Page_Load(Object sender EventArgs E)
{
int expr = ;
if (RequestCookies[Expr] == null)
{
// Expr cookie not set set with this response
HttpCookie cokExpr = new HttpCookie(Expr);
cokExprValue = exprTextBoxText;
ResponseCookiesAdd(cokExpr);
expr = ConvertToInt(exprTextBoxText);
}
else
{
// use existing cookie value
expr = ConvertToInt(RequestCookies[Expr]Value);
}
// use expr to customize page
}
由於Cookie存儲的信息是放到客戶端的用戶在訪問服務器端頁面時必然在客戶端和服務器端之間頻繁交換信息影響了程序的性能而Session由於存儲在服務器內存中因此不存在這個問題不過Session存儲的信息是臨時的用戶一旦關閉浏覽器狀態即失去而Cookie則相反
至於View State主要是指控件和頁面的狀態信息它以_VIEWSTATE值傳遞給服務器端
有興趣的可以看我另外一篇文章ASPNet中控件的EnableViewState屬性
ApplicationSession和Cookie可以借用Carfield的總結
COOKIE 是本地文件是 大盜在阿裡巴巴家做的記號或者是送牛奶的人在你家門口釘的箱子
SESSION 是服務器端內存是你洗澡時浴池發給你的鑰匙自己專用可以開自己的好多箱子
APPLICATION 是公共浴池在這裡能看見所有人包括 ppmm 哦)
From:http://tw.wingwit.com/Article/program/net/201311/12079.html