[ASP.NET学习笔记之十九]ASP.NET状态管理

来源:互联网 发布:淘宝详情页素材网站 编辑:程序博客网 时间:2024/05/16 00:28

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 中的TextBoxASP.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存储到浏览器中。所以一旦用户的安全策略禁用了CookieSession对象便无数据可用。

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:会话级别的状态存储

ApplicationSession对象的区别

作用域不同

Application对象是针对所有用户都生效,

Session对象则相反,每个用户都有自己的

Session对象,它的生命周期起始于服务器产生对用户请求页面的相应,终止于用户断开与

服务器的连接。