Asp.Net基础知识回顾_状态管理

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能够在控件、页面、程序、全局配置中设置,缺省状况下EnableViewStatetrue。若是要禁止全部页面ViewState功能,能够在程序配置中把EnableViewState设为false

3. Cookie

Cookie是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。Cookie包含每次用户访问站点时Web应用程序均可以读取的信息。例如,若是在用户请求站点中的页面时,应用程序发送给该用户的不只仅是一个页面,还有一个包含日期和时间的Cookie。用户的浏览器在得到页面的同时还得到了该Cookie,并将它存储在用户硬盘上的某个文件夹中。

之后,若是该用户再次请求站点中的页面,当该用户输入URL时,浏览器便会在本地硬盘上查找与该URL关联的Cookie。若是该Cookie存在,浏览器便将该Cookie与页请求一块儿发送到您的站点。而后,应用程序即可以肯定该用户上次访问站点的日期和时间。可使用这些信息向用户显示一条消息,也能够检查到期日期。

 ASP.NET包含两个内部Cookie集合。经过HttpRequestCookies的访问集合是由客户端包含以Cookie标头形式传输到服务器的Cookie。 经过HttpResponseCookies集合包含一些新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  URLCookie是否开启不影响Session使用,缺点是不能再使用绝对连接了。

前面说了SessionID能够存储在客户端的Cookie或者URL中,那么Session真正的内容存储在哪里呢?对于Session内容的存储有如下几种模式:

u  InProc(默认):Session存储在IIS进程中(Web服务器内存)。

u  StateServerSession存储在独立的Windows服务进程中(能够不是Web服务器)。 

u  SqlServerSession存储在SqlServer数据库的表中(SqlServer服务器)。

虽然InProc模式的Session直接存储在Web服务器IIS进程中,速度比较快,可是每次从新启动IIS都会致使Session丢失。利用后两种模式,咱们就彻底能够把SessionWeb服务器中独立出来,从而减轻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 是在原页面定义的属性, 须要传递的数据存入到此属性中。 

相关文章
相关标签/搜索