1、 状态管理html
名称数据库 |
类型编程 |
功能浏览器 |
Cookies缓存 |
System.Web.HttpCookieCollection安全 |
提供操做 HTTP Cookie 的类型安全方法。服务器 |
Sessioncookie |
System.Web.SessionState.HttpSessionState框架 |
提供对会话状态值以及会话级别设置和生存期管理方法的访问。ide |
Application |
System.Web .HttpApplicationState |
启用 ASP.NET 应用程序中多个会话和请求之间的全局信息共享。 |
ViewState |
System.Web.UI.StateBag |
管理 ASP.NET 服务器控件(包括页)的视图状态。 |
Cache |
System.Web.Caching |
实现用于 Web 应用程序的缓存。 |
1.0 QueryString
带有参数传递的URL以下: http://xxxx/xxxx.aspx?Keyword=kkkk 在客户端请求search.aspx后,能够经过下面的代码获取传来的信息: private void Page_Load (object sender, System.EventArgs e) { Label1.Text=Request.QueryString["Keyword"]; //也能够写为 Label1.Text=Request["Keyword"]; 效果是同等的;Post请求的是Form获取 }
2.0 ViewState
ViewState(视图状态)是ASP.NET中用来保存WEB控件回传时状态值的一种机制。在WEB窗体(FORM)的runat属性设置为server时,这个窗体(FORM)会被附加一个名为_VIEWSTATE的隐藏窗体,在该隐藏窗体中存放了全部控件在ViewState中的状态值。
ViewState是类Control中的一个域,其余全部控件经过继承Control来得到了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。
当请求某个页面时,ASP.NET把全部控件的状态序列化成一个字符串,而后作为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。固然这些所有是由ASP.NET负责。
定义ViewState属性: public String ValidateType { get { String o = (String)ViewState["ValidateType"]; renturn o; } set { this.ViewState["ValidateType"] = value; } }
使用ViewState的条件:
若是要使用ViewState,则在ASPX页面中必须有一个服务器端窗体标记<form runat=server>。这样包含ViewState隐藏字段的信息才能回传给服务器。并且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET页面框架才能添加隐藏的字段。
//注意: /*当存在页面回传时,不须要维持控件的值就要把ViewState禁止。 *ViewState的索引是大小写敏感的。 *ViewState不是跨页面的。 *当禁止一个程序的ViewState时,这个程序的全部页面的ViewState也被禁止。 *只有当页面回传自身时ViewState才是持续的。*/
设置ViewState:
ViewState能够在控件、页面、程序、全局配置中设置,缺省状况下EnableViewState为true。若是要禁止全部页面ViewState功能,能够在程序配置中把EnableViewState设为false。
3. Cookie
Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。Cookie包含每次用户访问站点时Web应用程序均可以读取的信息。例如,若是在用户请求站点中的页面时,应用程序发送给该用户的不只仅是一个页面,还有一个包含日期和时间的Cookie。用户的浏览器在得到页面的同时还得到了该Cookie,并将它存储在用户硬盘上的某个文件夹中。
之后,若是该用户再次请求站点中的页面,当该用户输入URL时,浏览器便会在本地硬盘上查找与该URL关联的Cookie。若是该Cookie存在,浏览器便将该Cookie与页请求一块儿发送到您的站点。而后,应用程序即可以肯定该用户上次访问站点的日期和时间。可使用这些信息向用户显示一条消息,也能够检查到期日期。
ASP.NET包含两个内部Cookie集合。经过HttpRequest的Cookies的访问集合是由客户端包含以Cookie标头形式传输到服务器的Cookie。 经过HttpResponse的Cookies集合包含一些新Cookie,这些Cookie在服务器上建立并以Set-Cookie标头的形式传输到客户端。
//(1)建立Cookie //建立Cookie方法1: Response.Cookies["userName"].Value = “admin"; Response.Cookies[“userName”].Expires = DateTime.Now.AddDays(1); //若是不设置失效时间,Cookie信息不会写到用户硬盘,浏览器关闭将会丢弃。 //建立Cookie方法2: HttpCookie aCookie = new HttpCookie(“lastVisit”); aCookie.Value = DateTime.Now.ToString(); //设置访问时间 aCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie); //建立多值Cookie方法1: Response.Cookies["userInfo"]["userName"] = “admin"; Response.Cookies["userInfo"]["lastVisit"] = DateTime.Now.ToString(); Response.Cookies["userInfo"].Expires = DateTime.Now.AddDays(1); //建立多值Cookie方法2: HttpCookie aCookie = new HttpCookie("userInfo"); aCookie.Values["userName"] = “admin"; aCookie.Values["lastVisit"] = DateTime.Now.ToString(); aCookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(aCookie);
//(2)读取Cookie //读取Cookie方法1: if(Request.Cookies["userName"] != null) Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value); //读取Cookie方法2: if(Request.Cookies["userName"] != null) { HttpCookie aCookie = Request.Cookies["userName"]; Label1.Text = Server.HtmlEncode(aCookie.Value); } //读取多值Cookie方法1: HttpCookie aCookie = Request.Cookies["userInfo"]; string userName=aCookie.Values[“userName”]; string lastVisit=aCookie.Values[“lastVisit”];
//(3)修改和删除Cookie //不可以直接修改或删除Cookie,只能建立一个新的Cookie,发送到客户端以实现修改或删除Cookie。请看如下示例: //删除 Cookie方法: //将其有效期设置为过去的某个日期。当浏览器检查Cookie的有效期时,就会删除这个已过时的Cookie。 HttpCookie cookie = new HttpCookie("userinfo1"); cookie.Expires=DateTime.Now.AddDays(-30); Response.Cookies.Add(cookie); //修改cookie方法: Response.Cookies["Info"]["user"] = "2"; Response.Cookies["Info"].Expires = DateTime.Now.AddDays(1); //删除cookie下的属性 HttpCookie acookie=Request.Cookies["Info"]; acookie.Values.Remove("userid"); acookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(acookie); //删除全部cookie,就是设置过时时间为如今就好了 int limit=Request.Cookies.Count - 1; for(int i=0;i<limit;i++) { acookie = Request.Cookies(i) acookie.Expires = DateTime.Now.AddDays(-1) Response.Cookies.Add(acookie) } //若是有主站及二级域名站且cookie要共享的话则要加入以下设置。 cookie.Domain = ".主域名"; cookie.Path = "/";
4. Application
Application(应用程序状态)是可供ASP.NET应用程序中的全部类使用的数据储存库。 它存储在服务器的内存中,所以与在数据库中存储和检索信息相比,它的执行速度更快。与特定于单个用户会话的会话状态不一样,应用程序状态应用于全部的用户和会话。所以,应用程序状态用于存储那些数量较少,不随用户的变化而变化的经常使用数据。
示例:
//Test1.aspx protected void Button1_Click(object sengder,EventArgs e) { Application[“name”] = “what the fuck”; Response.Redirect(“Test2.aspx”); } //Test2.aspx protected void Page_Load(object sengder,EventArgs e) { Response.Write(Application[“name”]); } //Application实质上是整个虚拟目录中全部文件的集合,若是想在整个应用范围内使用某个变量值,则Application对象将是最佳的选择。
5. Session
Session(会话状态)是Web系统中最经常使用的状态,用于维护和当前浏览器实例相关的一些信息。举个例子来讲,咱们能够把已登陆用户的用户名放在Session中,这样就能经过判断Session中的某个Key来判断用户信息。
用户首次与Web服务器创建链接的时候,服务器会给用户分发一个SessionID做为标识。SessionID是一个由24个字符组成的随机字符串。用户每次提交页面,浏览器都会把这个SessionID包含在HTTP头的Cookie中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪个客户端。
存储SessionID的模式:
u Cookie(默认)。若是客户端禁止了Cookie的使用,Session也将失效。
u URL。Cookie是否开启不影响Session使用,缺点是不能再使用绝对连接了。
前面说了SessionID能够存储在客户端的Cookie或者URL中,那么Session真正的内容存储在哪里呢?对于Session内容的存储有如下几种模式:
u InProc(默认):Session存储在IIS进程中(Web服务器内存)。
u StateServer:Session存储在独立的Windows服务进程中(能够不是Web服务器)。
u SqlServer:Session存储在SqlServer数据库的表中(SqlServer服务器)。
虽然InProc模式的Session直接存储在Web服务器IIS进程中,速度比较快,可是每次从新启动IIS都会致使Session丢失。利用后两种模式,咱们就彻底能够把Session从Web服务器中独立出来,从而减轻Web服务器的压力,同时减小Session丢失的几率。
所以,SessionID存储在客户端(能够是Cookie或者URL),其余都存储在服务端(能够是IIS进程、独立的Windows服务进程或者SQL Server数据库中)。
下面,咱们先来实践一下如何使用Session。首先,在页面上创建两个按钮。
<asp:Button ID="btn_WriteSession" runat="server"Text="写入Session" /> <asp:Button ID="btn_ReadSession" runat="server" Text="读取Session" /> //在btn_WriteSession按钮的Click事件处理方法中,写入两个Session,一个是简单的字符串,另一个是自定义的类。 protected void btn_WriteSession_Click(object sender, EventArgs e) { Session["SimpleString"] = "编程快乐"; MyUser user = new MyUser(); user.sUserName = "小朱"; user.iAage = 24; Session["CustomClass"] = user; //添加和删除都使用这种方法 } //Session的使用很是简单,直接对某个Key的Session进行赋值便可。自定义类MyUser以下: class MyUser { public string sUserName; public int iAage; public override string ToString() { return string.Format("姓名:{0},年龄:{1}", sUserName, iAage); } } //在这里,咱们重写了ToString()方法直接返回实例的一些信息。而后注册btn_ReadSession单击事件,实现从Session中读取数据的代码: protected void btn_ReadSession_Click(object sender, EventArgs e) { if (Session["SimpleString"]==null) { Response.Write("读取简单字符串失败<br/>"); } else { string s=Session["SimpleString"].ToString(); Response.Write(s + "<br/>"); } if (Session["CustomClass"]==null) { Response.Write("读取简单自定义类失败<br/>"); } else { MyUser user=Session["CustomClass"] as MyUser; Response.Write(user.ToString()+"<br/>"); } } //注意:在每次读取Session的值之前请务必先判断Session是否为空,不然颇有可能出现“未将对象引用设置到对象的实例”的异常。 //咱们看到,从Session中读出的数据都是object类型的,因此须要进行类型转化后才能使用。打开页面,先单击写入Session按钮,再单击读取Session按钮,页面输出如图所示。
6. Cache
7.Transfer 实际工做中还没用过
经过Server.Transfer 方法把执行流程从当前的ASPX 文件转到同一服务器上的另外一个ASPX 页面的同时,可保留表单数据或查询字符串,作法是把该方法的第二个参数设置成True,在第一个页面用Server.Transfer("目标页面名.aspx",true);目标页面取出数据用:Ruquest.Form["控件名称"]或Ruquest.QueryString["控件名称"]。
DemoPage pg1= this.DemoPage as DemoPage; Response.Write(pg1.Name);
注意:此段代码用在目标页面中取出传递的值,PowerEasyPage 是原页面的类名,Name 是在原页面定义的属性, 须要传递的数据存入到此属性中。