您的位置:首页 > 编程语言 > ASP

Asp.net 2.0状态管理小结

2008-05-21 23:51 316 查看
最近在开发过程中,想利用asp.net 状态管理机制来保存一些数据,却因为对其理解不当,导致除了不少错误。
看了一些文档,总结一下,希望能够加深印象。

所谓状态管理,简单的说就是实现页与页之间,请求与请求之间信息的共享。Cookie, Session,Cache, Application, ViewState,好像还有Profile,等可以用来进行状态管理,进行信息数据的共享。但是他们之间的差别和使用场合还是不同的,下面就我所理解和使用过的情况,对其简单的加以说明。

 Cookie:存储在Client端的字符串。注意只能存储字符串,并且大小还有限制:4K. 采用绝对时间过期策略,通常用来保存用户登陆信息。比如Csdn就是这样做的:允许你保存Cookie两个星期,在这个星期之内,你的登陆信息就保存在你的电脑里,每次打开站点,系统都会去读取cookie,如果不为空,就直接登陆。
由于是存储在客户端,安全自然不能保证。

 Session: 有三种存储方式:InProc,StateServer,SqlServer. InProc是默认的方式,信息存储在服务器内存中,可以存储任何类型数据,并且没有大小限制(如果信息过大,容易丢失)。stateserver方式,需要开启asp.net 状态服务,信息存储在windows服务所在服务器内存中,只能存储能序列化的信息(如果是class,需要加可序列化标记),无大小限制。sqlserver方式,信息存储在sqlserver数据库中,当然还要安装aspnetdb数据库(出现在sqlexpress中),也只能存储能序列化的信息,无大小限制。。。。
说了这么多,session到底能做什么?通常用来进行页面传值、或者事件之间共享信息等。session针对的是每个用户,这是它与cache的一点不同。如果要对查询的结果在另外的请求中再次使用,这个时候就要考虑session保存上次查询结果,而不必重新从数据库查询得到。
例外session默认的过期时间是20分钟,当然可以在web.config中配置,但是好像也不能设置太长的时间。

Cache: 可以把任何类型存在在服务器内存中,并且没有大小限制。但是根据服务器配置的不同,cache工作状况也会不一样。因为Cache是一种内存对象,在某种情况下会出现丢失的问题,没有很好的解决办法 ,只要系统资源一紧张,Cache就可能被清掉。这就是为什么Cache中存储的数据经常丢失的原因。所以在使用的时候首先判断Cache是否为null,如果为null,从员数据表取数据放入Cache,再使用Cache。
另外Cache一般用在更新不是很频繁,但是访问比较频繁的数据 如排行榜之类的 ;如前所说,cache在一个全局对象,对整个应用程序开放。所以不能用它来存储某个用户操作的结果信息(我就犯过这种错误)。
Cache的过期策略非常丰富:永不过期,绝对时间过期,平滑时间过期(在某个时间段内没操作即为过期),关联过期(如关联某个文件,文件有所更改,则cache过期)等。当然针对过期策略,cache的更新也可以采用主动回调或是被动存取两种方式进行。。

Application:应用程序级别,在应用程序开始时有效,关闭应用程序结束,没有过期策略(只要不关闭应用程序,就始终有效),信息存储在Web服务器内存中,针对所有用户可见。
通常在Global.asax文件的相关事件中控制作业,自我控制能力很差。由于每个用户都可以访问,所以在访问前应该对其加锁,访问结束解锁,以防并发。(Cache自己可以处理并发).
最常见的用途就是用来统计网站的访问量.

ViewState:信息存储客户端单页面中,页面在,它就在;页面关闭,它就失效.viewstate在保存客户端信息的时候,会参与数据回发,往返与服务器和客户端,所以,如果存储信息量过大,则会造成页面打开困难,
viewstate适用单用户,只能存储可序列化的信息。
通常,对于信息量不大,单页面信息暂存的场合非常有效.

Profile:通常用在保存用户的个性化设置. 可在web.config中配置Profile的属性信息,在服务端就可以直接访问,而后不同的用户可以设置不同的profile属性,Profile会为每个用户(登录用户或者匿名用户均可)设置唯一的ID,存储于Cookie中,并把这个ID和设置的个性化信息保存在数据库中(默认是SqlExpress中aspnetdb).而后,用户再次登陆同样的页面,profile就从cookie中读取ID,根据ID到数据库中找到匹配的个性化信息进行加载.
可见,Profile信息存在Cookie和数据库中,cookie在它就有效.适合单用户个性化设置;可序列化的信息均可以存储,大小受数据库限制。安全性还好,但是每次都从数据库加载信息,性能会受到影响.

除了以上几种状态管理的策略,我们经常还会使用URl进行页面传值。这就要用到QueryString,用法不再多说,但有一点要注意:对于一些特殊的字符(@#$),要想正确的传递,需要用HttpUtility.UrlEncode(s)进行Url编码;而后用 HttpUtility.UrlDecode();进行url解码才能正确获取。

asp.net 2.0还提供了一种“跨页提交”功能:可以在目标页面直接访问前一页面中控件的数据,但是需要注意PostBackUrl的应用:


<asp:Button ID="btnCrossPage" runat="server" PostBackUrl ="crosspage.aspx" Text="跨页面提交" OnClick="btnCrossPage_Click" />

在crosspage页面的Load事件中:


protected void Page_Load(object sender, EventArgs e)




...{


string s=(PreviousPage.FindControl("txtname") as TextBox).Text;


}

除此之外,我们还可以在目标页面访问源页面的方法和属性。
1.在目标页面头部需要添加对源页面的声明:
<%@ PreviousPageType VirtualPath ="~/Default.aspx" %>
2.在源页面Default.aspx中可以写一些public的方法和属性
private string pagename;

public string Pagename
{
get { return pagename; }
set { pagename = value; }
}
public string test()
{
return "hello world";
//ClientScript.RegisterStartupScript(GetType(),null,"alert('ok');",true);
}
3.在目标页面:
Label lbl = PreviousPage.FindControl("lbl") as Label;
string result = PreviousPage.Pagename;
string methodresult= PreviousPage.test();
Response.Write(lbl.Text+"--"+result+"--"+methodresult);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: