一、 状态管理
名称 | 类型 | 功能 |
Cookies | System.Web.HttpCookieCollection | 提供操作 HTTP Cookie 的类型安全方法。 |
Session | System.Web.SessionState.HttpSessionState | 提供对会话状态值以及会话级别设置和生存期管理方法的访问。 |
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 是在原页面定义的属性, 需要传递的数据存入到此属性中。