无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接,接下来介绍状态保存机制,感兴趣的朋友可以了解下
无状态Http
无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请求结果返回给浏览器后,会关闭当前Socket连接。而且服务器会在处理页面完毕后销毁页面对象。
应用层面的原因是:浏览器和服务器之间通信都遵守HTTP协议。
一个浏览者发出的请求都是由实现了IHttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了,写的类变量值早就不存在了,因此不能将状态信息保存到类变量中。
编写一个ashx 复制代码 代码如下: private int i;
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write(i++);
}
多次刷新我们发现,变量根本不会记忆上次的值。
对网站造成的影响:如果用户录入了一些信息,当跳转到下一个页面时,数据丢失,再也不能获得那些数据。
如果要知道上一次的状态信息,我们就得把这个状态信息记录在某个地方:
a.服务器端Session
b.浏览器端Cookie
c. 表单元素中—如:隐藏域<input type=“hidden”/>(Http报文)ViewState
未添加如下:
补充:
禁用ViewState的方法,禁用单个控件的ViewState设定enableviewstate=false。禁用整个页面的,在aspx的Page指令区加上EnableViewState="false" 。内网系统、互联网的后台可以尽情的用ViewState。但互联网前台就不要使用了【注:禁用也只是不保存服务端控件属性和值但隐藏域还是存在的】
WebForm的IsPostBack内部实现 就是对页面或者get传参中是否含有__ViewState这一参数名称进行判断返回bool值
证实: 复制代码 代码如下: protected void Page_Load(object sender, EventArgs e){ if (IsPostBack) //回传 Response.Write( "只要浏览器提交的请求报文里包含__VIEWSTATE这个键" );//在该页面地址 http://localhost:7148/ViewSatate.aspx 末尾添加 ?__VIEWSTATE 会输出此段代码 else Response.Write( "ASP.NET就会将页面的IsPostBack属性设置为true" ); }
|