阅读新闻

Application,Session,Cookie,ViewState的区别

[日期:2008-08-16] 来源:MajCMS内容管理系统官方     作者:麦吉龙 [字体大小: ]

application
application的数据保存在服务器的内存中,当关闭服务器时会丢失数据.

session
session的数据保存在服务器的内存中,当关闭服务器或用户退出网站都会丢失数据.

cokie
session的数据保存在用户的硬盘中,当用户把cokie文件删除就会丢失数据.

viewstate
viewstate的数据保存在服务器的内存中,当关闭服务器或用户退出网站或用户关闭该网页都会丢失数据.

详细说明:

Application用于保存所有用户共用的数据信息,如果被保存的数据在应用程序生存期内根本不会改变或很少改变,用它。但是在asp.net中有个web.config,可能更好点。如果要使用application,一个需要考虑的问题是任何写操作都有要在application_onstart事件中(Global.asax)中完成。尽管使用application.lock和application.unlock方法来避免操作的同步,但是它串行化了对application的请求,当网站访问量大时会造成性能瓶颈。因此最好不要用它存取大的数据集。
使用方法:
//存放信息
Application["test"] = "100";
//读取
String test = Application["test"].ToString();

Session 用于保存每个用户的专用信息,它的生存期是用户持续请求时间再加上一段时间(可以在web.config中设置,默认是20分钟)。Session中的信息保存在服务器的内存中,当然你也可以设置它的保存方法(如存在SQL数据库中)。由于用户停止使用程序后它仍然在内存中保持一段时间,因此使用Session对象保存用户数据的方法效率很低。对于小量的数据。使用Session还是一个不错的选择。
//存
 

Session["user"] = "majcms";


//取
 

String username = Session["user"].ToString();



Cookie用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它保存非敏感性的内容。保存时间可以根据需要设置。如果没有设置Cookie失效时间,它仅保存至浏览器关闭。如果将Cookie设置为Min Value,则表示它永不过期。Cookie存储量受到很大限制,一般浏览器支持最大容量为4096字节。因此不能用来存储大量数据。由于并非所有浏览器都支持Cookie,并且它是以明文方式保存的,所以最好不要保存敏感性的内容。否则会影响网络安全。
//存
Response.Cookies["name"].Value = "majcms";
//取
String username = Response.Cookies["name"].Value;

ViewState常用于保存单个用户的状态信息,有效期等于页面的生存期,注意:是单个页面的生存期,所以它的生存期是比其它三个都小的。ViewState容器可以保存大量的数据,但是必须谨慎使用,因为过多使用会影响性能,最明显的就是网页打开速度慢。所有Web服务器控制都使用ViewState在页面回发期间保存自已的信息状态,如果某个控件不需要在回发期间保存信息,最好将其ViewState属性关闭,(看一下控制的属性面板),避免不必要的资源浪费。通过设置页面的"EnableViewState=false"可以禁用整个页面的ViewState。
//存
ViewState["index"] = 1;
//取
int indexID = (int)ViewState["index"];


//存
ViewState["name"] = "majcms";
//取
String Name = ViewState["name"].ToString();

 

ViewState控件剖析:

 

分析了页面的ViewState的构成,我们再来看Control的ViewState的实现。ViewState是System.Web.UI.Control类实现的一个属性,这个属性的类型是System.Web.UI.StateBag,这个类就包含了ViewState数据结构的实现,实际上它的内部也就是个Hash表,通过Key值来保存和检索数据。
那么服务器控件是怎么实现保存状态的呢?
我们知道,所有的服务器控件都是从System.Web.UI.Control派生的,所以都拥有ViewState这个属性,在Control内部,定义了两个Protected的虚拟方法:
    protected virtual object SaveViewState()

protected virtual void LoadViewState(object savedState)

这两个方法是给子控件派生用来保存和读取自己的ViewState的,比如我们有一个自己写的控件,往ViewState中保存了一个字符串,那么我们的方法大致像这样:
    protected virtual object SaveViewState()
    {
       object[] states = new object[2];
       states[0] = base.SaveViewState();      //记得保存父控件的ViewState
       states[1] = "Hello,I'm timmy!";        //这里保存我们自己的
     
       return states; //返回重新包装后的保存对象
    }
    获取的时候:
    protected override void LoadViewState(object savedState) //这里的savedState就是我们Save的时候return 的object数组
    {
       object[] states = (object[])savedState;
       base.LoadViewState( states[0] );   //把父类的数据给他自己去解析
       string myData = (string)states[1]; //获取我们自己的数据
    }
   我们可以按照自己的方式来保存,不一定非要像上面这样用数组,实际上我们可以用任何支持序列化的对象都可以,父类并不关心子类如何保存,我们只要在Save和Load的时候使用同样的方式,并且把正确的数据传递给父类方法就可以了。
  
   另外,还有一个问题就是我们使用的Control的ViewState是Key-Value这样的键值对,那它是怎么保存的呢?
   实际上很简单,System.UI.Web下面有一个类叫Pair,呵呵,这个和Triplet差不多,只是它里面只有两个对象。StateBag保存的时候,First会存放所有Key值的数组,Second则存放所有Value的数组。

添加到网摘收藏 复制本文网址推荐 打印文章内容打印 |  录入:admin  |   阅读:190次