一、无状态Http
通俗:一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了。所以,Http协议是无状态的,服务器不记得上次给了浏览器什么。
无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。
对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。
二、解决方案:如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:
客户端的状态保持方案:ViewState、隐藏域、Cookies、控件状态、URL查询参数
服务端的状态保持方案:Session(会话)、Application、Caching(缓存)、DataBase(数据库)
常用:
1.ViewState:
1)ASP.NET 的 .aspx页面特有,页面级的;
2)就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式;
3)服务器端控件的值都自动保存在ViewState中;
2.Application:
1)在服务器端保存共享数据的一种方式;
2)通俗:就像银行的单人公共卫生间,谁进去都行,但一次去一个,进去了就锁上门,出来再把锁打开;
3.Cookie:
1)HTTP协议下的一种方式,通过该方式,服务器或脚本能够在客户机上维护状态信息;
2)就是在客户端保存客户端单独使用的数据的一种方式;
3)通俗:就像你的病历本一样,医院直接给你带回家;
4.Session:(现在指的是进程内Session。)
1)在服务器端保存客户端单独使用的数据的一种方式;
2)通俗就像银行账户,钱都存在银行里,你就拿一张银行卡(SessionId)回家;
三、ViewState
1.原理:
服务器在接收到用户请求一个页面后,会自动在请求报文中找看是否包含__VIEWSTATE的隐藏域,如果有,则将中间的值解码后添加到页面的ViewState属性中。服务器将ViewState里保存的值经过Base64编码后,自动添加到页面的隐藏域中。
服务器在输出的时候,也会自动的将ViewState中的值添加到表单里名叫__VIEWSTATE的隐藏域中。
使用ViewState可以方便的在服务器端将数据输出保存到客户端页面的一个隐藏域中。VIEWSTATE适用于同一个页面在不关闭的情况下多次与服务器交互,跨页面提交的__VIEWSTATE不会被目标页面装入页面的ViewState属性中。
当某些控件的某些属性不属于浏览器表单的提交范围时,framework将会把这些属性添加到ViewState中保存。
WebForm的IsPostBack依赖于__ViewState
2.操作:
1)用户数据保存方式:
ViewState["myKey"]="MyData";
2)读取数据方式:
string myData;
if(ViewState["myKey"]!=null)
{ myData=(string)ViewState["myKey"]; }
注意:ViewState不能存储所有的数据类型,仅支持可序列化对象。
3.非单值服务器控件的状态也自动保存在ViewState中
例如:下拉框。(文本框是单值控件,所以不会保存在ViewState中)
4.使用ViewState的前提:
页面上必须有一个服务器端窗体标记:< form runat=“server” >
5.缺点:加大网站的流量、降低访问速度、机密数据放到表单中会有数据欺骗等安全性问题。
6.ViewState禁用
1)禁用单个控件的ViewState:设定enableviewstate=false,禁用ViewState以后TextBox版本不受影响,Div版本受影响,因为input的value不依靠ViewState。
2)禁用整个页面的,在aspx的Page指令区加上EnableViewState="false" 。内网系统、互联网的后台可以尽情的用ViewState。
四、Application:作用于整个程序运行期的状态对象(保存网站共享数据)
1、概念:
就是存在服务器端的一个公共的键值对集合,为了避免脏读,使用之前一定记得加锁,用完后记得解锁。
2、原理:
Application对象对应HttpApplication类,它定义 ASP.NET 应用程序中的所有应用程序对象通用的方法、属性和事件。
第一个用户访问站点时,应用程序启动,并创建一个Application对象。创建成功后,整个应用程序中都可以使用该对象。除非应用程序关闭,否则对象一直存储在内存中。
3、操作:
1)设置Application:
Application.Lock();//加锁
Application["msg"] = "有空吗?"+DateTime.Now.ToString();//添加键值对
Application.UnLock();//解锁
Response.Write("消息保留成功~~~~");
2)获取Applicatio
浙公网安备 33010602011771号