ASP.NET中,有多种保存信息的对象,如:Application,Session,Cookie,ViewState、Cache等,它们有什么区别?应用环境是什么?



为了更清楚的了解,我们总结出每一种对象应用的具体环境,如下表所示:





















Application






1、Application用来保存

所有用户共用

的信息;



2、在Asp时代,如果要保存的数据在应用程序生存期内不会或者很少发生改变,那么使用Application是理想的选择。但是在Asp.net开发环境中我们把类似的配置数据放在Web.config中;



3、如果要使用Application要注意的是所有的写操作都要在Application_OnStart事件中完成(global.Asax),尽管可以使用Application.Lock()避免了冲突,但是它串行化了对Application的请求,会产生严重的性能瓶颈;



4、不要使用Application保存大数据量信息;



5、代码:




Application[


"UserID"


] =


"test"


;


//写








string


UserName = Application[


"UserID"


].ToString();


//读



















Session





1、Session用来保存

每一个用户的专有

信息;


2、Session的生存期是用户持续请求时间加上一段时间(一般是20分钟左右);


3、Session信息是保存在Web服务器内存中的,保存数据量可大可小;


4、Session超时或者被关闭将自动释放数据信息;


5、由于用户停止使用应用程序之后它仍在内存中存留一段时间,因此这种方法效率较低;


6、代码:




Session[


"UserID"


] =


"test"


;


//写








string


UserName = Session[


"UserID"


].ToString();


//读



















Cookie





1、Cookie用来保存

客户浏览器请求

服务器页面的请求信息;


2、我们可以存放非敏感的用户信息,保存时间可以根据需要设置;


3、如果没有设置Cookie失效日期,它的生命周期保存到关闭浏览器为止;


4、Cookie对象的Expires属性设置为MinValue表示永不过期;


5、Cookie存储的数据量受限制,大多数的浏览器为4K因此不要存放大数据;


6、由于并非所有的浏览器都支持Cookie,数据将以明文的形式保存在客户端;


7、代码:




Resopnse.Cookies[


"UserID"


] =


"test"


;


//写








string


UserName = Resopnse.Cookies[


"UserID"


].ToString();


//读



















ViewState





1、ViewState用来保存

用户的状态

信息,有效期等于页面的生命周期;


2、可以保存大量数据但是要慎用,因为会影响程序性能;


3、所有的Web服务器控件都是用ViewState在页面PostBack期间保存状态;


4、不需要则关闭 @page 里面设置EnableViewState=false;


5、代码:




ViewState[


"ID"


] =


"test"


;


//写








string


ID = ViewState[


"ID"


].ToString();


//读













Cache





1、Cache用于

在Http请求期间

保存页面或者数据;


2、Cache的使用可以大大的提高整个应用程序的效率;


3、它允许将频繁访问的服务器资源存储在内存中,当用户发出相同的请求后,服务器不是再次处理而是将Cache中保存的数据直接返回给用户;


4、可以看出Cache节省的是时间(服务器处理时间);


5、Cache实例是每一个应用程序专有的,其生命周期==该应用程序周期,应用程序重启将重新创建其实例;


6、注意:如果要使用缓存的清理、到期管理、依赖项等功能必须使用Insert 或者Add方法方法添加信息;


7、代码:




Cache[


"ID"


] =


"test"


; 或者 Cache.Insert(


"ID"


,


"test"


);


//写








string


ID = Cache[


"ID"


].ToString();


//读













Hidden





1、Hidden控件属于html类型的服务器控件,要使用Runat=server,

始终处于隐藏状态




2、每一次提交的时候它会和其他服务器控件一起提交到服务器端;


3、代码:




Hidden.Value =


"king"


;


//写








string


id = Hidden.Value;


//读













查询字符串





1、查询字符串的方式是将要传递的值连接在URL后面;


2、一般用于页面之间传递信息;


3、由于URL的长度有一定的限制,因此不能传递太大的信息;


4、安全性不是很好。


5、代码:




Response.Redirect(


"List.aspx?id=123&name=abc"


);


//传值页面








string


name = Request.QueryString[


"name"




];


//取值页面






string


id = Request.QueryString[


"id"


];










global.Asax 文件







Application_start:




第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计、,历史访问人数统计的初始化等等均可在这里定义.




Application_end:




网站关闭,或重启时,会触发该方法. 没有进行过多试验.




Session_start :




每个用户访问网站的第一个页面时触发;




Session_end:




使用了session.abandon(),或session超时用户退出后均可触发.



注意:



Session_end中不能使用session对象、 server.mappath()、服务器对象。 所以只能用session.contents("username") 取代session("username"),或者用Application对象或方法;



例如:



想在session_end中使用Server.MapPath("users.xml"),则应在Application_start 中定义Application("xmlPath") = Server.MapPath("users.xml"),然后在session_end中调用Application("XmlPath"),而不能直接在session_end中使用诸如:Server.MapPath("users.xml"),








Application、session执行顺序是:





1、Application_start



2、session_start



3、session_end



4、Application_end