首页 > 编程 > .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 哦:)。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表