[ASP.NET学习笔记之十九]ASP.NET状态管理
2006-08-24 10:40
435 查看
ASP.NET状态管理
• 状态管理概述
Http协议-“无状态协议”
• Web服务器每分钟对上千个用户进行管理的一种方式就是执行所谓的“无状态”连接。只要有一个希望浏览器返回一个页面、图象或其他资源的请求,就发生以下事情:– 连接到服务器
– 告诉服务器想要的页面、图象或者其他项
– 服务器发送请求的资源
– 服务器切断连接,把用户忘的干干净净。
WEB页面处理过程
• 页面的一次往返处理:用户对Server Control的一次操作,就可能引起页面的一次往返处理:页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端• 页面重建:每一次页面被请求,或者页面事件被提交到服务器,asp.net运行环境将执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等等页面信息。
• 页面处理内部过程:
– Page_load :IsPostBack属性判定页面是否为第一次被请求
– 事件处理:这一阶段处理表单的事件
– Page_Unload :这个阶段页面已经处理完毕,需要做些清理工作。一般地,你可以在这个阶段关闭打开的文件和数据库链路,或者释放对象
ASP.NET Web Form的“连续”和“有状态”假象
• ASP.NET 的设计者们,从实际访问者的角度重新考虑了这一过程:访问者打开一个页面,点击一个按钮,看到新的画面……这一切似乎都是连续的。• 这种连续性假象是由ASP.NET 页框架、页及其控件实现的。回发后,控件的行为必须看起来是从上次Web 请求结束的地方开始的。
• 另一方面,对于Web Form 中的TextBox,ASP.NET 也让它们具有了状态,可以知道上一个loop 和这一个loop 之间的TextBox 值的变化;如果变化,可能会触发TextBox 的TextChanged事件。这同样是ASP.NET 特意实现的一个假象。
• 基于客户端的状态管理
• 视图状态
ASP.NET 使用了ViewState 视图状态,是所有控件的一个属性。如果你查看Web Form 产生的HTML 代码,可以看到一个名为__ViewState 的隐藏字段,ASP.NET 将状态信息以Hash 的方式存储在这里。通过它,可以在下一次回发时知道回发前各控件的状态。ASP.NET 服务器控件的生命周期
1. 初始化- Init 事件(OnInit 方法)2. 加载视图状态- LoadViewState 方法
3. 处理回发数据- LoadPostData 方法
4. 加载- Load 事件(OnLoad 方法)
5. 发送回发更改通知-RaisePostDataChangedEvent 方法
6. 处理回发事件- RaisePostBackEvent 方法
7. 预呈现- PreRender 事件(OnPreRender 方法)
8. 保存视图状态- SaveViewState 方法
9. 呈现- Render 方法
10. 处置- Dispose 方法
11. 卸载- UnLoad 事件(OnUnLoad 方法)
视图状态
• 启用视图状态EnableViewState = “true”,默认为true,如果为false,那么该控件和子控件的视图状态就不会被串行化。
• 可以在视图状态中存储的类型Int32,Bool,String,Color,Array,ArrayList,Unit及其以上类型的HashTable对象。
• 视图状态与安全
视图状态串行化的字符串表达式作为明文来往返传送。这是不安全的。在视图状态中决不能保存任何信息(例如口令、连接字符、文件路径) 。
【实例代码】
//在启用视图状态,直接应用ViewState,它也是一种键-值对
ViewState["currentpage"] = 1;
//控件禁用视图状态
<asp:Label id="lbText" style="Z-INDEX: 103; LEFT: 261px; POSITION: absolute; TOP: 92px" runat="server" EnableViewState="False">
//页面级禁用视图状态
<%@ Page language="c#" Inherits=" " EnableViewState="false" CodeFile=".aspx.cs" %>
• 隐藏的窗体域
隐藏域• 隐藏域不会显示在用户的浏览器中,但我们可以象设置标准控制的属性那样设置其属性。当一个网页被提交给服务器时,隐藏域的内容和其他控制的值一块儿被送到HTTP Form集合中。隐藏域可以是任何存储在网页中的与网页有关的信息的存储库,隐藏域在其value属性中存储一个变量,而且必须被显性地添加在网页上。• ASP.NET中的HtmlInputHidden控制提供了隐藏域的功能。
隐藏域使用注意事项
• 隐藏域在其值属性中存储单个变量,并且必须被显式添加到页上。然后可以将值插入到隐藏域。
• 为了在页处理期间隐藏域的值可供使用,必须使用HTTP POST 方法提交该页。
• 恶意用户可以很容易地查看和修改隐藏域的内容。请不要在隐藏域中存储任何敏感
信息或保障应用程序正确运行的信息。
【实例代码】
<INPUT id="Hidden1" style="Z-INDEX: 101; LEFT: 175px; POSITION: absolute; TOP: 70px" type="hidden" value="隐藏域测试!" name="Hidden1" runat="server">
//后台代码可以要取值,必须把它设为服务器控件
string v=this.Hidden1.Value.ToString();
• Cookie
什么是Cookie?• 由网络服务器发送出来以存储在网络浏览器上的小量信息
• Cookie是把与用户和网站相关的信息存储比会话时间还长的一种方式
• Cookie存储在用户的硬盘上(一般存储在Web浏览器软件所在的文件夹上,称为
Cookies)
Cookies是如何工作的
• IE存储在C:/Documents andSettings/<Username>/Cookies下
• IE选项中的“隐私”选项下修改cookie设置,也可以在“常规”选项卡下选择“删除cookie”
如何使用Cookie
• 使用Response对象设置Cookie状态
– Response.Cookies[“UserName”].Value =“张三”;
• 使用Request对象读取已有的Cookie
– string strName = Request.Cookies[“UserName].Value;
• 清除:
Response.Cookies[“UserName”].Value=null;
Response.Cookies[“UserName”].Expires= new System.DateTime(1999,10,12);
Cookie的属性
• Value:值,是String类型的
• Domain:设置这个属性后,只有在这个域下才能访问该Cookie。
例如:
//指定只有以“.Webcast.com.cn”结尾的域可以访问本Cookie
Response.Cookies[“UserName”].Domain = “.Webcast.com.cn”;
• Path:该属性指定哪些路径下的页面可以访问此Cookie。
• Expires:指定Cookie过期的日期
【实例代码】
//注册Cookies
Response.Cookies["username"].Value = tbUserName.Text;
Response.Cookies["username"].Expires = DateTime.Now.AddMinutes(10);
//使用Cookies
if (Request.Cookies["username"]!=null)
strMessage = "亲爱的"+Request.Cookies["username"].Value+",欢迎登录本网站!";
else
strMessage = "欢迎登录本网站!";
查询字符串
• 查询字符串提供了一种简单而受限制的维护状态信息的方法,我们可以方便地将信息从一个网页传递给另一个网页。• 带有查询字符串的URL如下所示:http://www.examples.com/list.aspx?catego
ryid=1&productid=101
• 使用:
string categoryid, productid;
categoryid=Request.Params[“categoryid”];
productid=Request.Params[“productid”];
使用查询字符串的注意事项
• 大多数浏览器和客户端装置都把URL的长度限制在255个字符长。• 查询值是通过URL传递给互联网的,因此,在有些情况下,安全就成了一个大问题。
• 我们只能使用HTTP-Get提交该互联网网页,否则就不能从查询字符串获得需要的值。
【实例代码】
//GET方法
Response.Redirect("Read.aspx?username="+tbUseName.Text+"&password="+tbPass.Text);
Response.Write("您的用户名称为:"+Request.Params["username"]+"<br>");
Response.Write("您的密码为:"+Request.Params["password"]+"<br>");
//POST方法
LabelName.Text = "您的姓名是:" + Request.Form["username"];
基于服务器的状态管理
基于服务器的状态管理信息存储在服务器上,尽管其安全性较高,但会占用较多的web服务器资源。服务器端通常用以下方式实现状态管理:
• Aplication对象
• Session对象
Application状态
• 应用程序级别的状态存取• 变量状态的存储和提取
– Application[“Name”] = “张三”
– string strUserName = Application[“Name”];
• 同时访问要加锁:
– Application.Lock();
– Application.Unlock();
Application对象的使用建议
• 对于频繁使用的数据使用改对象• 不要把太多的信息放在该对象中
• 如果站点有很大的通信量,建议使用Web.Config
【实例代码】
Application.Lock();
if(Application["counter"]!=null)
Application["counter"] = Convert.ToInt32(Application["counter"])+1;
else
Application["counter"] = 1;
Application.UnLock();
lbInfo.Text = "您是第"+Application["counter"]+"位访问者!";
Session
什么是Session(会话)– 对网站的一次访问
– 超时后,自动结束会话
什么时候用Session?
• 购物篮-网络用户决定购买的商品列表
• 用户信息-访问者的姓名
• 用户设置-个性化界面
ASP和ASP.NET会话区别
• ASP中用于标识会话的120位会话ID总是作为一个Cookie存储到浏览器中。所以一旦用户的安全策略禁用了Cookie,Session对象便无数据可用。
• ASP.NET的会话实现弥补了这个缺陷,它允许“无Cookie”的会话,以及在服务器之外存储会话数据。ASP.NET会话状态模块在Web.config文件中像下面这样配置:
– <sessionState mode="InProc" cookieless="false" timeout="20" />
– 在这个例子中,mode属性设为InProc(默认值),表明会话状态要由ASP.NET存储到内存中,而且不用Cookie来传递会话ID。
Session的属性和方法
• TimeOut属性:获取和设置会话结束之前的时间段,以分钟位单位。默认为20分钟。
• Abandon():结束当前会话。会话中的所有信息都被清空
• Clear():删除当前会话中的所有信息,但不结束会话
• IsNewSession:如果会话是在用户访问页面时创建的,则这个属性返回true。当会话需要对某些数据进行初始化后才能使用时,就可以使用这个属性。
如何用Session存储状态
• 和Application类似
– Session[“Name”] = “张三”;
• 和Application的区别:
– Application:应用程序级别的状态存储
– Session:会话级别的状态存储
Application和Session对象的区别
• 作用域不同– Application对象是针对所有用户都生效,
– Session对象则相反,每个用户都有自己的
Session对象,它的生命周期起始于服务器产生对用户请求页面的相应,终止于用户断开与
服务器的连接。
相关文章推荐
- ASP.NET学习笔记 ---系统对象与状态管理
- Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理
- Asp.net控件开发学习笔记(五)---Asp.net客户端状态管理
- ASP.NET学习笔记三 : 系统对象与状态管理(二)
- Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理
- ASP.NET 2.0 状态管理 学习笔记(一)
- ASP.NET学习笔记二 系统对象与状态管理
- 【转】Asp.net控件开发学习笔记整理篇--Asp.net服务端状态管理
- Asp.net控件开发学习笔记-Asp.net客户端状态管理
- 【转】Asp.net控件开发学习笔记整理篇 - Asp.net客户端状态管理
- Asp.net控件开发学习笔记(五)---Asp.net客户端状态管理
- ASP.NET 2.0 状态管理 学习笔记( 二)
- ASP.net(1.1)原理学习笔记--第十章 状态管理State Management
- ASP.NET 3.5核心编程学习笔记(35):会话状态的自定义管理
- ASP.NET温故而知新学习系列之ASP.NET中的状态—基于服务器端的状态管理Session(二)
- ASP.NET 3.5核心编程学习笔记(36):页面的视图状态和控件状态
- ASP.NET 3.5核心编程学习笔记(50):ASP.NET的安全性之Membership与角色管理
- 黑马程序员之ASP.NET学习笔记:Http状态代码及其含义
- ASP.NET常用信息保持状态学习笔记一
- 笔记:asp.net自定义控件的视图状态管理