ASP.NET 之四大常用状态(信息)保持方式
ASP.NET中状态(信息)保持方案有如下几种:
客户端的状态信息保持本质上来说有3种:隐藏域/Cookies /Querystring(URL传参)
服务器端: Session(会话)/ Application/ Caching(缓存)/DataBase(数据库)
常用的四大状态(信息)保持方式为:ViewState 、 Cookie [服务器端];Session、Application [服务器端]
ViewState(页面级):
保存的数据只有在当前页面不关闭的情况下才能够使用
ASP.NET 的 .aspx页面特有,页面级的;就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式
服务器端控件(除那些在查看看源文件以表单标签存在的[如:文本框,按钮等])的值大多都会自动保存在ViewState中
非单值服务器控件的状态也自动保存在ViewState中
存储的值得类型为object类型 (必须可以进行序列化)
使用方式
用户数据保存方式示例: 当点击submit按钮的时候 页面数字依次刷新
aspx:
<form id="form1" runat="server"> <div> <input id="Submit" type="submit" value="submit" /> </div> </form>
aspx.cs:
1 int num = 0; 2 if (!IsPostBack) 3 { 4 ViewState["num"] = num; 5 } 6 else 7 { 8 num = int.Parse(ViewState["num"].ToString()); 9 num++; 10 ViewState["num"] = num; 11 } 12 Response.Write(num);
通过查看原源可以看到如下代码:
1 <form method="post" action="Viewstate.aspx" id="form1"> 2 <div class="aspNetHidden"> 3 <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTEzNDM3NzkxOQ8WAh4DbnVtAg1kZFjP0kir7oNa1uhkqdxh/XYVmMmQtWmVm8yOjozghxWo" /> 4 </div> 5 6 <div> 7 <input id="Submit" type="submit" value="submit" /> 8 </div>
对比编译时的代码此代码段多出了一个隐藏域,正是这个隐藏域的value 记录了上一次的数据使得每次点击submit按钮数据得以依次增加
通过工具可以查看到隐藏域value存储的信息如下图:
隐藏域value的值到底是怎嘛来的呢? 它是由viewstate对象序列化后经过Base64编码后形成的 。 读取时浏览器对value进行反编译然后反序列化最后输出。这个过程是自动进行的
应用: 大多是一些小页面。比较大的页面一般不会使用它(如:淘宝)
禁用ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false,禁用ViewState以后TextBox版本不受影响,Div版本受影响,因为input的value不依靠ViewState。
Cookie:
Cookie是一种能够让网站服务器把少量数据(4kb左右)储存到客户端的硬盘(设置了过期时间)或内存(不设置过期时间),并且读取出来的一种技术。
浏览器访问一个站点时,只将属于当前站点的Cookie发过到服务器。(根据域名)—(没必要把每家医院的病历本都带过去。)
Cookie不兼容浏览器!(不同浏览器不共享Cookie文件数据)
服务器端语言和客户端语言都可以操作
cookie的读和写都是浏览器做的
存储的数据类型为字符串
使用示例:
写:
1 HttpCookie hc = new HttpCookie("test", "My is test"); 2 // 设cookie的过期时间。 3 hc.Expires = DateTime.Now.AddDays(7); 4 Response.Cookies.Add(hc);
读:
1 HttpCookie hc = Request.Cookies["test"]; 2 if (hc!= null) 3 { 4 Response.Write(hc.Value); 5 }
如果服务器两次输出同一名称的cookie则相当于对cookie重新赋值
* 服务器向浏览器写出Cookie实际上就是在 响应报文中 生成响应行:
* Set-Cookie: uinfo2=123; expires=Mon, 06-Jun-2011 06:48:47 GMT; path=/
* 浏览器读取此 响应行后 会自动在客户端硬盘中产生一个Cookie文件,名为:
* Cookie:[email protected]/,注意@后的 localhoust/ ,实际上是颁发此Cookie网站的域名;
* 当浏览器下次再访问此域名时,就会自动将 后缀为 localhoust/ 的cookie文件内容发送到服务器
cookie的删除 : 服务器是不能直接的去删除浏览器上的cookie的,但是可以过设置cookie的过期时间来删除cookie(将过期时间设为-1)
cookie. Path(为指定的文件夹生成Cookie)
cookie.Domain (域/域名)
Cookie是和站点相关的,并且每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。Cookie也是保存在浏览器端的,而且浏览器会在每次请求的时候都会把和这个站点的相关的Cookie提交到服务器,并且将服务端返回的Cookie更新到硬盘,因此可以将信息保存在Cookie中,然后在服务器端读取、修改。服务器返回数据除了普通的html数据以外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新本地浏览器的Cookie就可以。
哪怕请求jpg、js、css这种文件也会带着Cookie,因为服务器端可能要进行Session的操作,比如判断是否登录。互联网优化的案例:图片服务器和主站域名不一样,降低Cookie流量的传输
Session:常用于保存登录用户ID、验证码
不同的浏览器不能共用session 因为不同的浏览器保存的sessionid(可以通过工具监视响应报文看到)不同
存储的数据只为某个客户端服务 ,并且能被网站的所有页面访问 跟cookie类似
Session只可由该会话的用户访问(因为SessionId的东东以cookie的方式保存访问者浏览器的缓存里了)
当会话过期或终止时,服务器就会清除 Session 对象
任何一个类在使用session的时候 都要告诉类要使用session,一般应用程序默认情况下不会还原session
一般应用程序在使用的时候 需添加:using System.Web.SessionState并实现IRequiresSessionState接口而aspx.cs、aspx则不需要,因为aspx.cs
系统在默认情况下已经实现了IRequiresSessionState接口(可以通过反编译工具看到), aspx原本就是继承与aspx.cs的所以它也就间接的实现了IRequiresSessionState接口
如果浏览器禁用了Cookie可以启用Url来传递SessionID。
开始并为Session赋值(存储的数据为object类型):
Session[“uName”]=“name”;
取值:
string strName = Session["uName"].ToString();
销毁(取消/退出):
Session.Abandon();//销毁服务器端的Session对象
Session.Clear();//清空服务端的Session对象里的键值对,Session对象并没有从Session池里销毁
Session常用属性、方法
属性 |
描述 |
SessionID |
唯一用户会话标识符 |
TimeOut |
用户超时(单位:分钟),默认20分钟 |
Count |
会话状态集合中的项目数 |
方法 |
描述 |
Abandon方法 |
用于显式结束会话。 |
Application :
在服务器端保存共享数据的一种方式
但每次只能有一个访问者访问
使用示例:
// 写入: // 锁定 Application.Lock(); // 存入数据 Application["num"] = 0; // 解锁 Application.UnLock(); // 读取: Response.Write(Application["num"].ToString());
多用于全局应用程序类中来记录数据 例如:记录当前网站的同时是在线人数(不准确的)