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

[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
• 购物篮-网络用户决定购买的商品列表
• 用户信息-访问者的姓名
• 用户设置-个性化界面
ASPASP.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对象,它的生命周期起始于服务器产生对用户请求页面的相应,终止于用户断开与
服务器的连接。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: