资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第6章 ASP.NET应用程序状态管理 如果读者曾经有过开发Windows应用程序的经验,可能不太 会留意维护应用程序状态,因为应用程序本身就在客户端 运行,可以直接在内存中维护其应用程序状态。但是对于 ASP.NET应用程序来说,事情不那么简单了,因为ASP.NET 应用程序在服务器端运行,客户端使用无状态的HTTP协议 对ASP.NET应用程序发出请求,ASP.NET应用程序响应用户 请求,向客户端发送请求的HTML代码,服务器并不会维护 任何客户端状态。考虑一个有着成千上万并发用户的服务 器,如果为每个用户都维护状态的话会耗费非常多的资源 。 对于一个Web应用程序来说,通常需要维护应用程序的状态 。比如电子商务网站的购物车,当客户在多个页面中选择 商品时,需要为其维护一个所选商品的列表。ASP.NET为解 决状态维护的问题提供了多种方法,本章将详细讨论如何 使用这些方法为ASP.NET应用程序添加状态管理功能。6.1 ASP.NET状态管理简介由于使用无状态的HTTP协议作为Web应用程序的通信协议,当客户 端每次请求页面时,ASP.NET服务器端都将重新生成一个网页的新 实例。这意味着客户端用户在浏览器中的一些状态或者是一些修 改都将丢失。比如一个客户管理系统,用户在很多文本框中输入 了内容,当点击提交按钮到服务器后,从服务器返回的将是一个 全新的网页,用户所添加的内容将全部丢失。 记得在使用ASP的时候,笔者为了保存每个文本框控件中的值信息 ,在数据提交前使用了大量的Session变量来保存每个文本框的值 ,并在页面重新生成后将这些会话变量中的值一一赋给每个控件 。这是一件相当费时费力的工作,可谓事倍功半。在ASP.NET最初 推出以后,让笔者眼前一亮的是,当页面回发(Postback)后, 控件依然能保存其输入的值,ASP.NET使用ViewState技术,也称 为视图状态为控件保存了状态信息, ASP.NET中提供了如下几大 用于状态管理的技术:6.2 ViewState视图状态视图状态可以说是应用最为广泛的一种技术,几乎每个ASP.NET服 务器控件都具有EnableViewState属性,允许控件在页面回送时保 存其属性值。开发人员也可以使用Page.ViewState集合类添加自 己的状态数据,可以使用这个属性保存简单的数据类型或者是自 定义的对象类型。例如可以使用视图状态保存一个计数器的值, 代码如下: protected void Page_Load(object sender, EventArgs e) ViewState“Counter“ = 5; 可以看到ViewState是一个字典类型的对象,使用 ViewStatekey=value的格式来设置值,如果在集合中存在指定 键的值,则进行替换,否则将自动创建一个新的键值对。6.2.1 视图状态原理应用程序在运行时,ASP.NET引擎会自动在源代码的尾部嵌 入的一个隐藏域(HiddenField),命名为_VIEWSTATE。 _VIEWSTATE以键/值对集合的形式保存页面中控件的状态数 据,_VIEWSTATE将这些值以Base64编码格式编码字符串, 如下代码所示: 6.2.2 在视图状态中存储对象在ViewState中,可以存储用户自定义的对象数据,但是必须知道 ,当存储一个自定义对象时,ASP.NET必须能够转换该对象为字节 流以便于将对象添加到页面隐藏域中进行保存。这意味着自定义 对象必须支持序列化,否则ASP.NET将会抛出异常。 下面创建一个名为ViewStateSample的ASP.NET Web站点,右击网 站项目名称,选择“添加新项”菜单项,添加一个新的类,命名 为Book.cs,如图所示:6.2.3 视图状态的安全ViewState中的数据以Base64编码的格式保存在客户端浏览器中, 目前,可以使用很多工具解码Base64编码的字符串,例如可以使 用一款名为ViewState Decoder的工具来直接查看视图状态的数据 结构,如图所示。6.3 跨页传递信息 使用视图状态有一个很大的限制就是不能跨页传 递信息,如果用户导航到其他页面,那信息将会 被丢失。本节将讨论如何在多个页面之间传递信 息,可以使用查询字符串或者是跨页提交技术。 如果这些技术都不能满足应用程序的要求,那么 可以考虑使用cookies、会话状态或者是应用程状 态,本章以后将会详细的讨论。6.3.1 查询字符串 最常用的方法应该是在URL中使用查询字符串来传 递信息,现今网络上多如牛毛的网站都使用这种 技术来在页面之间传递信息。例如如果从每一个 页面上获取了当前用户的用户ID,希望在第二个 页面上显示关于此ID的详细信息,可以使用如下 的查询字符串: http:/www.xxx.com/a.aspx?UserID=1002 可以看到查询字符串是URL的一部分,以一个问号 开始,可以使用/www.xxx.com/a.aspx?UserID=1002 DataSetObject=(DataSet)Session“myDataSet“; 会话状态对当前用户来说是全局性的,不论用户访问哪个页面, 都可以获取存储在会话状态中的信息。但是必须注意,有如下几 个选项将会导致会话状态丢失: 用户关闭并重新启动了浏览器。 用户使用不同的浏览器访问相同的页面,浏览器不同将具有不同 的处理会话的方式,因此也会导致会话状态的丢失。6.5.3 配置会话状态 ASP.NET允许开发人员在web.config配置当前应用 程序的会话状态,可以在这个文件中配置一些较 高级的会话状态选项。web.config有一个名为 sessionState的配置块,在该块中提供了很多与 Session相关的配置选择,一个简单的 sessionState配置块的代码如下所示: 下面来分别对这些配置节进行详细的讨论: 1Cookieless使用Cookie保存会话ID 2Timeout指定应用程序会话超时时间 3cookieName用于指定存储会话ID的Cookie名称 4mode用于指定会话状态值的位置6.6 应用程序状态 应用程序状态是指在整个应用程序范围内可被任 何客户端进行访问的一些全局对象。应用程序状 态基于System.Web.HttpApplicationState类,可 以在任何位置使用Page类内置的Application对象 来访问应用程序对象。 应用程序状态的使用方式与Session基本一致,都 支持相同的对象类型,信息都保存在服务器上, 并且使用一致的基于字典的语法。使用应用程序 变量的一个常见的例子是网页计数器,6.7 小结 本章讨论了ASP.NET中的状态管理技术,首先介绍 了ASP.NET引入的视图状态,介绍了视图状态的原 理,如何在视图状态中存储自定义对象以及视图 状态的安全性。接下来讨论了如何在多个页面中 传递信息,讨论了如何使用查询字符串,如何使 用跨页回送技术让页面回送到其他页面。 6.4节讨论了使用Cookie技术保存会话信息,并介 绍了会话状态和应用程序状态这两种服务器端的 状态维护技术。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号