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

一、 状态管理

名称

类型

功能

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可以在控件、页面、程序、全局配置中设置,缺省情况下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 是在原页面定义的属性, 需要传递的数据存入到此属性中。 

转载于:https://www.cnblogs.com/entclark/p/8613624.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值