国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.Net狀態管理

2024-07-10 12:56:57
字體:
來源:轉載
供稿:網友
asp.net提供了四種狀態類型:application,session,cookie,view。

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

至于view state,主要是指控件和頁面的狀態信息,它以_viewstate值傳遞給服務器端。有興趣的可以看我另外一篇文章:asp.net中控件的enableviewstate屬性

application、session和cookie,可以借用carfield的總結:

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹东市| 磐石市| 思茅市| 五大连池市| 兴安盟| 巴南区| 青田县| 宜宾市| 廉江市| 波密县| 通州市| 新河县| 呼图壁县| 布尔津县| 大埔县| 攀枝花市| 施秉县| 宁国市| 炎陵县| 固原市| 清远市| 屏山县| 龙陵县| 营山县| 永善县| 河南省| 唐河县| 保康县| 宁乡县| 大埔县| 阳城县| 河北区| 永嘉县| 汽车| 会泽县| 格尔木市| 措美县| 冕宁县| 资兴市| 临清市| 宣恩县|