读书人

ASP.NET内置对象,应用程序配备和缓存

发布时间: 2012-09-04 14:19:30 作者: rapoo

ASP.NET内置对象,应用程序配置和缓存

??? <div>

??? <% Response.Write("缓冲区被清除"); %>??????????????????????????????????????????????????????????????????? //输出字符串

??? </div>

??? </form>

</body>

上述代码在页面中插入了一段代码,并输出字符串“缓冲区被清除”。在运行该页面时,数据已经存放在缓冲区中。然后IIS才开始读取HTML组件的部分,读取完毕后才将结果送至客户端浏览器,所以在运行结果中可以发现,“缓冲期清除前”是在“缓冲区被清除”字符串之前出现,如图13-2所示。

?

图13-2? BufferOutput

因为BufferOutput属性默认为true,所以上述代码并无法看到明显的区别,当在浏览器输出前清除缓冲区时,则可以看出区别。示例代码如下所示。

??????????? Response.Write("缓冲区清除前..");

????????? ??Response.Clear();??????????????????????????????????????????????????????????????????????????????????????????? //清除缓冲区

当使用Response的Clear方法时,缓冲区就被显式的清除了。在运行后,“缓冲区清除前”字符串被清除,并不会呈现给浏览器。当需要屏蔽Clear方法对缓冲区的数据清除,则可以指定BufferOutput的属性为False,示例代码如下所示。

??????????? Response.BufferOutput = false;??????????????????????????????????????????????????????????????????? //设置缓冲区属性

??????????? Response.Write("缓冲区清除前..");??????????????????????????????????????????????????????????????? //设置清除前字符

??????????? Response.Clear();??????????????????????????????????????????????????????????????????????????????????????????? //清除缓冲区

使用上述代码将指定BufferOutput的属性为False,在运行时缓冲区数据不会被Clear方法清除。

2.Response常用方法

Response方法可以输出HTML流到客户端,其中包括发送信息到客户端和客户端URL重定向,不仅如此,Response还可以设置Cookie的值以保存客户端信息。Response的常用方法如下所示:

q? Write:向客户端发送指定的HTTP流。

q? End:停止页面的执行并输出相应的结果。

q? Clear:清除页面缓冲区中的数据。

q? Flush:将页面缓冲区中的数据立即显示。

q? Redirect:客户端浏览器的URL地址重定向。

在Response的常用方法中,Write方法是最常用的方法,Write能够向客户端发送指定的HTTP流,并呈现给客户端浏览器,示例代码如下所示。

???? Response.Write("<div style=\"font-size:18px;\">这是一串<span style=\"color:red\">HTML</span>流</div>");

上述代码则会向浏览器输出一串HTML流并被浏览器解析,如图13-3所示。

?

图13-3? Response.Write方法

当希望在Response对象运行时,能够中途进行停止时,则可以使用End方法对页面的执行过程进行停止,示例代码如下所示。

??????????? for (int i=0; i < 100; i++)??????????????????????????????????????????????????????????????????????????????????? //循环100次

??????????? {

??????????????? if (i < 10)???????????????????????????????????????????????????????????????????????????????????????????????????? //判断i<10

? ??????????????{

??????????????????? Response.Write("当前输出了第" + i + "行<hr/>");???????????????????????? //i<10则输出i

??????????????? }

??????????????? else????????????????????????????????????????????????????????????????????????????????????????????????????????????? //否则停止输出

??????????????? {

??????????????????? Response.End();??????????????????????????????????????????????????????????? ?????????????????? //使用了End方法停止执行

??????????????? }

??????????? }

上述代码循环输出HTML流“当前输出了第X行”,当输出到10行时,则停止输出,如图13-4所示。

?

图13-4? Response.End方法

Redirect方法通常使用于页面跳转,示例代码如下所示。

??????????? Response.Redirect("http://www.shangducms.com");????????????????????????????????????????? //页面跳转

执行上述代码,将会跳转到相应的URL。

13.1.3 ?Application状态对象

Application对象是HttpApplication类的实例,将在客户端第一期从某个特定的ASP.NET应用程序虚拟目录中请求任何URL资源时创建。对于Web应用上的每个ASP.NET应用程序都要创建一个单独的实例。然后通过内部Application对象公开对每个实例进行引用。

1.Application对象的特性

对于Application对象有如下特性:

q? 数据可以在Application对象之内进行数据共享,一个Application对象可以覆盖多个用户。

q? Application对象可以用Internet Service Manager来设置而获得不同的属性。

q? 单独的Application对象可以隔离出来并运行在内存之中。

q? 可以停止一个Application对象而不会影响到其他Application对象。

Application对象常用的属性有:

q? AllKey:获取HttpApplicationState集合中的访问键。

q? Count:获取HttpApplicationState集合中的对象数。

其中Application对象的常用方法有:

q? Add:新增一个Application对象变量。

q? Clear:清除全部的Application对象变量。

q? Get:通过索引关键字或变量名称得到变量的值。

q? GetKey:通过索引关键字获取变量名称。

q? Lock:锁定全部的Application对象变量。

q? UnLock:解锁全部的Application对象变量。

q? Remove:使用变量名称移除一个Application对象变量。

q? RemoveAll:移除所有的Application对象变量。

q? Set:使用变量名更新一个Application对象变量。

2.Application对象的使用

通过使用Application对象的方法,能够对Application对象进行操作,使用Add方法能够创建Application对象,示例代码如下所示。

??????????? Application.Add("App", "MyValue");????????????????????????????????????????????????????????????? //增加Application对象

??????????? Application.Add("App1", "MyValue1");????????????????????????????????????????????????????????? //增加Application对象

??????????? Application.Add("App2", "MyValue2");????????????????????????????????????????????????????????? //增加Application对象

若需要使用Application对象,可以通过索引Application对象的变量名进行访问,示例代码如下所示:

??????????? Response.Write(Application["App1"].ToString());?????????????????????????????????????? //输出Application对象

上述代码直接通过使用变量名来获取Application对象的值。通过Application对象的Get方法也能够获取Application对象的值,示例代码如下所示。

??????????? for (int i = 0; i < Application.Count; i++)????????????????????????????????????????????????????????????????? //遍历Application对象

??????????? {

??????????????? Response.Write(Application.Get(i).ToString());?????????????????????????????????? //输出Application对象

??????????? }

Application对象通常可以用来统计在线人数,在页面加载后可以通过配置文件使用Application对象的Add方法进行Application对象的创建,当用户离开页面时,可以使用Application对象的Remove方法进行Application对象的移除。当Web应用不希望用户在客户端修改已经存在的Application对象时,可以使用Lock对象进行锁定,当执行完毕相应的代码块后,可以解锁。示例代码如下所示。

??????????? Application.Lock();??????????????????????????????????????????????????????????????????????????????????????????? //锁定Application对象

??????????? Application["App"] = "MyValue3";?????????????????????????????????????????????????????????????????? //Application对象赋值

??????????? Application.UnLock();????????????????????????????????????????????????????????????????????????????????????? //解锁Application对象

上述代码当用户进行页面访问时,其客户端的Application对象被锁定,所以用户的客户端不能够进行Application对象的更改。在锁定后,也可以使用UnLock方法进行解锁操作。

13.1.4? Session状态对象

Session对象是HttpSessionState的一个实例,Session是用来存储跨页程序的变量或对象,功能基本同Application对象一样。但是Session对象的特性与Application对象不同。Session对象变量只针对单一网页的使用者,这也就是说各个机器之间的Session的对象不尽相同。

例如用户A和用户B,当用户A访问该Web应用时,应用程序可以显式的为该用户增加一个Session值,同时用户B访问该Web应用时,应用程序同样可以为用户B增加一个Session值。但是与Application不同的是,用户A无法存取用户B的Session值,用户B也无法存取用户A的Session值。Application对象终止于IIS服务停止,但是Session对象变量终止于联机机器离线时,也就是说当网页使用者关闭浏览器或者网页使用者在页面进行的操作时间超过系统规定时,Session对象将会自动注销。

1.Session对象的特性

Session对象常用的属性有:

q? IsNewSession:如果用户访问页面时是创建新会话,则此属性将返回true,否则将返回false。

q? TimeOut:传回或设置Session对象变量的有效时间,如果在有效时间内有没有任何客户端动作,则会自动注销。

注意:如果不设置TimeOut属性,则系统默认的超时时间为20分钟。

Session对象常用的方法有:

q? Add:创建一个Session对象。

q? Abandon:该方法用来结束当前会话并清除对话中的所有信息,如果用户重新访问页面,则可以创建新会话。

q? Clear:此方法将清除全部的Session对象变量,但不结束会话。

注意:Session对象可以不需要Add方法进行创建,直接使用Session[“变量名”]=变量值的语法也可以进行Session对象的创建。

2.Session对象的使用

Session对象可以使用于安全性相比之下较高的场合,例如后台登录。在后台登录的制作过程中,管理员拥有一定的操作时间,而如果管理员在这段时间不进行任何操作的话,为了保证安全性,后台将自动注销,如果管理员需要再次进行操作,则需要再次登录。在管理员登录时,如果登录成功,则需要给管理员一个Session对象,示例代码如下所示。

??????? protected void Button1_Click(object sender, EventArgs e)

??????? {

??????????? Session["admin"] = "guojing";???????????????????????????????????????????????????????????????????????? //新增Session对象

??????????? Response.Redirect("Session.aspx");??????????????????????????????????????????????????????????? //页面跳转

??????? }

当管理员单击注销按钮时,则会注销Session对象并提示再次登录,示例代码如下所示。

??????? protected void Button2_Click(object sender, EventArgs e)

??????? {

??????????? Session.Clear();??????????????????????????????????????????????????????????????????????????????????????????????? //删除所有Session对象

??????????? Response.Redirect("Session.aspx");

??????? }

在Page_Load方法中,可以判断是否已经存在Session对象,如果存在Session对象,则说明管理员当前的权限是正常的,而如果不存在Session对象,则说明当前管理员的权限可能是错误的,或者是非法用户正在访问该页面,示例代码如下所示。

??????? protected void Page_Load(object sender, EventArgs e)

??????? {

??????????? if (Session["admin"] != null)?????????????????????????????????????????????????????????????????? //如果Session[“admin”]不为空

??????????? {

??????????????? if (String.IsNullOrEmpty(Session["admin"].ToString()))?????????? //则判断是否为空字符串

??????????????? {

??????????????????? Button1.Visible = true;??????????????????????????????????????????????????????????? //显式登录控件

??????????????????? Button2.Visible = false;????????????????????????????????????????????????????????? //隐藏注销控件

??????????????????? //Response.Redirect("admin_login.aspx");???????????????????????? //跳转到登录页面

??????????????? }

??????????????? else

??????????????? {

??????????????????? Button1.Visible = false;????????????????????????????????????????????????????????? //显式注销控件

??????????????????? Button2.Visible = true;??????????????????????????????????????????????????????????? //隐藏注销控件

?? ?????????????}

??????????? }

??????? }

上述代码当管理员没有登录时,则会出现登录按钮,如果登录了,存在Session对象,则登录按钮被隐藏,只显示注销按钮。其HTML代码如下所示。

??????? <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="登录" />

??????? <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="注销" />

上述代码运行后如图13-5和图13-6所示。

?

图13-5? 登录前????????? 图13-6? 登录后

当再次单击【注销】按钮时则会清空Session对象,再次返回登录窗口时会呈现同图13-5所示。

13.1.5 ?Server服务对象

Server对象是HttpServerUtility的一个实例,该对象提供对服务器上的方法和属性进行访问。

1.Server对象的常用属性

Server对象的常用属性如下所示。

q? MachineName:获取远程服务器的名称。

q? ScriptTimeout:获取和设置请求超时。

通过Server对象能够获取远程服务器的信息,示例代码如下所示。

??????? protected void Page_Load(object sender, EventArgs e)

??????? {

??????????? Response.Write(Server.MachineName);????????????????????????????????????????????????????????????? //输出服务器信息

??????? }

上述代码运行后将会输出服务器名称,本例输出为“WIN-YXDGNGPG621”,这个输出结果根据服务器的名称不同而不同。

2.Server对象的常用方法

Server对象的常用方法如下所示。

q? CreatObject:创建COM对象的一个服务器实例。

q? Execute:使用另一个页面执行当前请求。

q? Transfer:终止当前页面的执行,并为当前请求开始执行新页面。

q? HtmlDecode:对已被编码的消除Html无效字符的字符串进行解码。

q? HtmlEncode:对要在浏览器中显示的字符串进行编码。

q? MapPath:返回与Web服务器上的执行虚拟路径相对应的物理文件路径。

q? UrlDecode:对字符串进行解码,该字符串为了进行HTTP传输而进行编码并在URL中发送到服务器。

q? UrlEncode:编码字符串,以便通过URL从Web服务器到客户端浏览器的字符串传输。

在ASP.NET中,默认编码是UTF-8,所以在使用Session和Cookie对象保存中文字符或者其他字符集时经常会出现乱码,为了避免乱码的出现,可以使用HtmlDecode和HtmlEncode方法进行编码和解码。HTML页面代码如下所示。

<body>

??? <form id="form1" runat="server">

??? <p>

??????? HtmlDecode:

??????? <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

??? </p>

??? <p>

??????? HtmlEncode:

??????? <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>

??? </p>

??? </form>

</body>

上述代码使用了两个文本标签控件用来保存并呈现编码后和解码后的字符串,在CS页面可以对字符串进行编码和解码操作,示例代码如下所示。

??????????? string str = "<p>(*^__^*) 嘻嘻……</p>";??????????????????????????????????????????????????????????????? //声明字符串

??????????? Label1.Text = Server.HtmlEncode(str);?????????????????????????????????????????????????????????????????????????? //字符串编码

??????????? Label2.Text = Server.HtmlDecode(Label1.Text);??????????????????????????????????????????????? //字符串解码

上述代码将str字符串进行编码并存放在Label1标签中,Label2标签将读取Label1标签中的字符串再进行解码,运行后如图13-7所示。

?

图13-7? HtmlEncode和HtmlDecode

在使用了HtmlEncode方法后,编码后的HTML标注会被转换成相应的字符,如符号“<”会被转换成字符“<”。在进行解码时,相应的字符会被转换回来,并呈现在客户端浏览器中。当需要让浏览器能够接受HTML字符时,URL地址栏中对页面的参数的传递不能够包括空格,换行等符号,如果需要使用该符号,可以使用UrlEncode方法和UrlDecode方法进行变量的编码解码,示例代码如下所示。

??????? protected void Button1_Click(object sender, EventArgs e)

??????? {

??????????? string str = Server.UrlEncode("错误信息 \n 操作异常");??????????????????????????? //使用UrlEncode进行编码

??????????? Response.Redirect("Server.aspx?str=" + str);???????????????????????????????????????????? //页面跳转

??????? }

在Page_Load方法中可以接收该字符串,示例代码如下所示。

??????????? if (Request.QueryString["str"] != "")

??????????? {

??????????????? Label3.Text = Server.UrlDecode(Request.QueryString["str"]);????????????????? //使用UrlDecode进行解码

??????????? }

当长字符串跳转和密封的信息在页面中进行发送和传递时,可以使用UrlEncode方法和UrlDecode方法进行变量的编码解码,以提高应用程序的安全性。

3.Server.MapPath方法

在创建文件,删除文件或者读取文件类型的数据库时(如Access和SQLite),都需要指定文件的路径并显式的提供物理路径执行文件的操作,如D:\Program Files。但是这样做却暴露了物理路径,如果有非法用户进行非法操作,很容易就显示了物理路径,这样就造成了安全问题。

而如果在使用文件和创建文件时,如果非要为创建文件的保存地址设置一个物理路径,这样非常不便并且用户体验也不好。当用户需要上传文件时,用户不可能知道也不应该知道服务器路径。如果使用MapPath方法能够实现。MapPath方法以“/”开头,则返回Web应用程序的根目录所在的路径,若MapPath方法以“../”开头,则会从当前目录开始寻找上级目录,如图13-8所示,而其实际服务器路径如图13-9所示。

?

图13-8? MapPath示意图?????????????????????????????? 图13-9? 服务器路径

在图13-8所示,其中论坛根目录为root,在根目录下有一个文件夹为file1,在file1中的文件可以使用MapPath访问根目录中文件的方法有Server.MapPath(“../文件名称”)或Server.MapPath(“/文件名称”),示例代码如下所示。

??????????? string FilePath = Server.MapPath("../Default.aspx");?????????????????????????????????????????? //设置路径

??????????? string FileRootPath = Server.MapPath("/Default.aspx");??????????????????????????????????? //设置路径

Server.MapPath其实返回的是物理路径,但是通过MapPath的封装,通过代码无法看见真实的物理路径,若需要知道真实的物理路径,只需输出Server.MapPath即可,示例代码如下所示。

??????????? Response.Write(Server.MapPath("../Default.aspx"));????????????????????????????????????????? //输出路径

上述代码输出结果为D:\ASP.NET 3.5\源代码\第13章\13-1\13-1\Default.aspx,该结果针对不同的物理路径而不同。

13.1.6 ?Cookie状态对象

Session对象能够保存用户信息,但是Session对象并不能够持久的保存用户信息,当用户在限定时间内没有任何操作时,用户的Session对象将被注销和清除,在持久化保存用户信息时,Session对象并不适用。

1.Cookie对象

使用Cookie对象能够持久化的保存用户信息,相比于Session对象和Application对象而言,Cookie对象保存在客户端,而Session对象和Application对象保存在服务器端,所以Cookie对象能够长期保存。Web应用程序可以通过获取客户端的Cookie的值来判断用户的身份来进行认证。

ASP.NET内包含两个内部的Cookie集合。通过HttpRequest的Cookies集合来进行访问,Cookie不是Page类的子类,所以使用方法和Session和Application不同。相比于Session和Application而言,Cookie的优点如下所示。

q? 可以配置到期的规则:Cookie可以在浏览器会话结束后立即到期,也可以在客户端中无限保存。

q? 简单:Cookie是一种基于文本的轻量级结构,包括简单的键值对。

q? 数据持久性:Cookie能够在客户端上长期进行数据保存。

q? 无需任何服务器资源:Cookie无需任何服务器资源,存储在本地客户端中。

虽然Cookie包括若干优点,这些优点能够弥补Session对象和Application对象的不足,但是Cookie对象同样有缺点,Cookie的缺点如下所示。

q? 大小限制:Cookie包括大小限制,并不能无限保存Cookie文件。

q? 不确定性:如果客户端配置禁用Cookie配置,则Web应用中使用的Cookie将被限制,客户端将无法保存Cookie。

q? 安全风险:现在有很多的软件能够伪装Cookie,这意味着保存在本地的Cookie并不安全,Cookie能够通过程序修改为伪造,这会导致Web应用在认证用户权限时会出现错误。

Cookie是一个轻量级的内置对象,Cookie并不能将复杂和庞大的文本进行存储,在进行相应的信息或状态的存储时,应该考虑Cookie的大小限制和不确定性。

2.Cookie对象的属性

Cookie对象的属性如下所示:

q? Name:获取或设置Cookie的名称。

q? Value:获取或设置Cookie的Value。

q? Expires:获取或设置Cookie的过期的日期和事件。

q? Version:获取或设置Cookie的符合HTTP维护状态的版本。

3.Cookie对象的方法

Cookie对象的方法如下所示:

q? Add:增加Cookie变量。

q? Clear:清除Cookie集合内的变量。

q? Get:通过变量名称或索引得到Cookie的变量值。

q? Remove:通过Cookie变量名称或索引删除Cookie对象。

4.创建Cookie对象

通过Add方法能够创建一个Cookie对象,并通过Expires属性设置 Cookie对象在客户端中所持续的时间,示例代码如下所示。

??????????? HttpCookie MyCookie = new HttpCookie("MyCookie ");

??????????? MyCookie.Value = Server.HtmlEncode(“我的Cookie应用程序”); //设置Cookie的值

??????????? MyCookie.Expires = DateTime.Now.AddDays(5);???????????????????????????????????? //设置Cookie过期时间

??????????? Response.AppendCookie(MyCookie);?????????????????????????????????????????????? //新增Cookie

上述代码创建了一个名称为MyCookie的Cookies,上述代码通过使用Response对象的AppendCookie方法进行Cookie对象的创建,与之相同,可以使用Add方法进行创建,示例代码如下所示。

??????????? Response.Cookies.Add(MyCookie);

上述代码同样能够创建一个Cookie对象,当创建了Cookie对象后,将会在客户端的Cookies目录下建立文本文件,文本文件的内容如下所示。

MyCookie

MyCookie

注意:Cookies目录在Windows下是隐藏目录,并不能直接对Cookies文件夹进行访问,在该文件夹中可能存在多个Cookie文本文件,这是由于在一些网站中进行登录保存了Cookies的原因。

5.获取Cookie对象

Web应用在客户端浏览器创建Cookie对象之后,就可以通过Cookie的方法读取客户端中保存的Cookies信息,示例代码如下所示。

??????? protected void Page_Load(object sender, EventArgs e)

??????? {

??????????? try

??????????? {

??????????????? HttpCookie MyCookie = new HttpCookie("MyCookie ");?????????????????????????????????????????????? //创建Cookie对象

??????????????? MyCookie.Value = Server.HtmlEncode("我的Cookie应用程序");???????????????????? //Cookie赋值

??????????????? MyCookie.Expires = DateTime.Now.AddDays(5);??????????????????????????????????????????????? //Cookie持续时间

??????????????? Response.AppendCookie(MyCookie);?????????????????????????????????????????????????????????????????? //添加Cookie

??????????????? Response.Write("Cookies 创建成功");??????????????????????????????????????????????????????????????????? //输出成功

??????????????? Response.Write("<hr/>获取Cookie的值<hr/>");

??????????????? HttpCookie GetCookie = Request.Cookies["MyCookie"];??????????????????????????????????? //获取Cookie

??????????????? Response.Write("Cookies的值:" + GetCookie.Value.ToString() + "<br/>");???? //输出Cookie值

??????????????? Response.Write("Cookies的过期时间:" + GetCookie.Expires.ToString() + "<br/>");

??????????? }

??????????? catch

??????????? {

??????????????? Response.Write("Cookies 创建失败");??????????????????????????????????????????????????????????????????? //抛出异常

??????????? }

??????? }

上述代码创建一个Cookie对象之后立即获取刚才创建的Cookie对象的值和过期时间。通过Request.Cookies方法可以通过Cookie对象的名称或者索引获取Cookie的值。

在一些网站或论坛中,经常使用到Cookie,当用户浏览并登录在网站后,如果用户浏览完毕并退出网站时,Web应用可以通过Cookie方法对用户信息进行保存。当用户再次登录时,可以直接获取客户端的Cookie的值而无需用户再次进行登录操作。

13.1.7 ?Cache缓存对象

Cache对象通过HttpContext对象的属性或Page对象的Cache属性来提供。Cache对于每个应用程序域均创建该类的实例,只要相应的应用程序域是激活状态,则该实例则为有效状态。

1.Cache对象的属性

Cache对象的属性如下所示:

q? Count:获取存储在缓存中的Cache对象的项数。

q? Item:获取或设置指定外键的缓存项。

2.Cache对象的方法

Cache对象的方法如下所示。

q? Add:将指定的项添加到Cache对象,该对象具有依赖项,过期和优先级策略,以及一个委托。

q? Get:从Cache对象检索指定项。

q? Remove:从应用程序的Cache对象移除指定项。

q? Insert:向Cache对象插入一个新项。

3.Cache对象的使用

Cache对象可以使用Get方法从相应的Cache对象中获取Cache对象的值,Get方法能够通过Cache对象的名称和索引来获取Cache对象的值,示例代码如下所示。

??????? protected void Button1_Click(object sender, EventArgs e)

??????? {

?????????? ?try

??????????? {

??????????????? Cache.Get("Label1.Text");????????????????????????????????????????????????????????????????????? //获取Cache对象的值

??????????? }

??????????? catch??????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //捕获异常,同try使用

??????????? {

??????????????? Label2.Text = "获取Cache的值失败!";???????????????????????????????????????????????? //输出错误异常信息

??????????? }

??????? }

通过Cache的Count属性能够获取现有的Cache对象的项数,示例代码如下所示。

??????? Response.Write("Cache对象的项数有" + Cache.Count.ToString());????????????? //输出Cache项数

13.1.8 ?Global.asax配置

Global.asax配置文件也称作ASP.NET应用程序文件,该文件是可选文件。该文件包含用于相应ASP.NET或HttpModule引发的应用程序级别事件的代码。Global.asax配置文件主流在基于ASP.NET应用程序的根目录中,在应用程序运行时,首先编译器会分析Global.asax配置文件并将其编译到一个动态生成的.NET Framework类,该类是从HttpApplication基类派生的。Global.asax配置文件不能够通过URL进行访问,以保证配置文件的安全性。

1.创建Global.asax配置文件

Global.asax配置文件通常处理高级的应用程序事件,如Application_Start、Application_End、Session_Start等,Global.asax配置文件通常不为个别页面或事件进行请求相应。创建Global.asax配置文件可以通过新建【全局应用程序类】文件来创建,如图13-10所示。

?

图13-10? 创建Global.asax配置文件

创建完成Global.asax配置文件,系统会自动创建一系列代码,开发人员只需要向相应的代码块中添加事务处理程序即可。

2.应用域开始(Application_Start)和应用域结束(Application_End)事件

在Global.asax配置文件中,Application_Start事件会在Application对象被创建时触发,通常Application_Start对象能够对应用程序进行全局配置。在统计在线人数时,通过重写Application_Start方法可以实现实时在线人数统计,示例代码如下所示。

??????? protected void Application_Start(object sender, EventArgs e)

??????? {

??????????? Application.Lock();???????????????????????????????????????????????????????????????????????????????????????????????????? //锁定Application对象

??????????? Application["start"] = "Application对象被创建";???????????????????????????????????????????????????? //创建Application对象

??????????? Application.UnLock();??????????????????????????????????????????????????????????????????????????????????????????????? //解锁Application对象

??????? }

当用户使用Web应用时,就会触发Application_Start方法,而与之相反的是,Application_End事件在Application对象结束时被触发,示例代码如下所示。

??????? protected void Application_End(object sender, EventArgs e)

??????? {

??????????? Application.Lock();???????????????????????????????????????????????????????????????????????????????????????????????????? //锁定Application对象

??????????? Application["end"] = "Application对象被销毁";???????????????????????????????????????????????????? //清除Application对象

??????????? Application.UnLock();??????????????????????????????????????????????????????????????????????????????????????????????? //解锁Application对象

??????? }

当用户离开当前的Web应用时,就会触发Application_End方法,开发人员能够在Application_End方法中清理相应的用户数据。

3.应用域错误(Application_Error)事件

Application_Error事件在应用程序发送错误信息时被触发,通过重写该程序,可以控制Web应用程序的错误信息或状态,示例代码如下所示。

??????? protected void Application_Error(object sender, EventArgs e)

??????? {

??????????? Application.Lock();???????????????????????????????????????????????????????????????????????????????????????????????????? //锁定Application对象

??????????? Application["error"] = "一个错误已经发生";???????????????????????????????????????????????????????????? //错误发生

??????????? Application.UnLock();??????????????????????????????????????????????????????????????????????????????????????????????? //解锁Application对象

??????? }

4.Session开始(Session_Start)和Session结束(Session_End)事件

Session_Start事件在Session对象开始时被触发。通过Session_Start事件可以统计应用程序当前访问的人数,同时也可以进行一些与用户配置相关的初始化工作,示例代码如下所示。

??????? protected void Session_Start(object sender, EventArgs e)

??????? {

??????????? Session["count"] = 1;????????????????????????????????????????????????????????????????????????????????????????????????? //Session开始执行

??????? }

与之相反的是Session_End事件,当Session对象结束时则会触发该事件,当使用Session对象统计在线人数时,可以通过Session_End事件减少在线人数的统计数字,同时也可以对用户配置进行相关的清理工作,示例代码如下所示。

??????? protected void Session_End(object sender, EventArgs e)

??????? {

??????????? Session["count"] = null;?????????????????????????????????????????????????????????????????????????????????????????????????????? //设置Session为null

??????????? Session.Clear();???????????????????????????????????????????????????????????????????????????????????????????????????????? //清除Session对象

??????? }

上述代码当用户离开页面或者Session对象生命周期结束时被触发,在Session_End中可以清除用户信息进行相应的统计操作。

注意:Session对象和Application对象都能够进行应用程序中在线人数或应用程序统计的统计和计算。在选择对象时,可以按照应用要求(特别是对象生命周期的要求)选择不同的内置对象。

13.2 ASP.NET应用程序配置

ASP.NET包含一个重要的特性,它为开发人员提供了一个非常方便的系统配置文件,就是常用的Web.config和Machine.config。配置文件能够存用户或应用程序的储配置信息,让开发人员能够快速的建立Web应用环境,以及扩展Web应用配置。

13.2.1 ASP.NET应用程序配置

ASP.NET为开发人员提供了强大的灵活的配置系统,配置系统通常通过文件的形式存在于Web应用根目录下。这些配置文件通常包括两类,分别是Web.config和Machine.config。Machine.config是服务器配置文件。服务器配置信息通常存储在该文件中,该文件一般存储在系统目录中的“systemroot\Microsoft.NET\Framework\VersionNumber\CONFIG”目录下。一台服务器只有一个Machine.config文件,该文件描述了所有ASP.NET Web应用程序所需要的默认配置。

Web.config是应用程序配置文件,该文件从Machine.config文件集成一部分基本配置,并且Web.config能够作为服务器上所有ASP.NET应用程序配置的跟踪配置文件。每个ASP.NET应用程序根目录都包含Web.config文件,所以对于每个应用程序的配置都只需要重写Web.config文件中的相应配置节即可。

在ASP.NET应用程序运行后,Web.config配置文件按照层次结构为传入的每个URL请求计算惟一的配置设置集合。这些配置只会计算一次便缓存在服务器上。如果开发人员针对Web.config配置文件进行了更改,则很有可能造成应用程序重启。值得注意的是,应用程序的重启会造成Session等应用程序对象的丢失,而不会造成服务器的重启。

注意:如果针对Web.config文件中某些配置节(如processModel配置节)进行了更改,则可能需要重启IIS才能够让所做的应用程序配置立即生效。

13.2.2? Web.config配置文件

ASP.NET应用程序的配置信息都存放于Web.config配置文件中,Web.config配置文件是基于XML格式的文件类型,由于XML文件的可伸缩性,使得ASP.NET应用配置变得灵活、高效、容易实现。同时,ASP.NET不允许外部用户直接通过URL请求访问Web.config,以提高应用程序的安全性。

1.Web.config配置文件的优点

Web.config配置文件使得ASP.NET应用程序的配置变得灵活、高效和容易实现,同时Web.config配置文件还为ASP.NET应用提供了可扩展的配置,使得应用程序能够自定义配置,不仅如此,Web.config配置文件还包括以下优点。

q? 配置设置易读性:由于Web.config配置文件是基于XML文件类型,所有的配置信息都存放在XML文本文件中,可以使用文本编辑器或者XML编辑器直接修改和设置相应配置节,相比之下,也可以使用记事本进行快速配置而无需担心文件类型。

q? 更新的即时性:在Web.config配置文件中某些配置节被更改后,无需重启Web应用程序就可以自动更新ASP.NET应用程序配置。但是在更改有些特定的配置节时,Web应用程序会自动保存设置并重启。

q? 本地服务器访问:在更改了Web.config配置文件后,ASP.NET应用程序可以自动探测到Web.config配置文件中的变化,然后创建一个新的应用程序实例。当浏览者访问ASP.NET应用时,会被重定向到新的应用程序。

q? 安全性:由于Web.config配置文件通常存储的是ASP.NET应用程序的配置,所以Web.config配置文件具有较高的安全性,一般的外部用户无法访问和下载Web.config配置文件。当外部用户尝试访问Web.config配置文件时,会导致访问错误。

q? 可扩展性:Web.config配置文件具有很强的扩展性,通过Web.config配置文件,开发人员能够自定义配置节,在应用程序中自行使用。

q? 保密性:开发人员可以对Web.config配置文件进行加密操作而不会影响到配置文件中的配置信息。虽然Web.config配置文件具有安全性,但是通过下载工具依旧可以进行文件下载,对Web.config配置文件进行加密,可以提高应用程序配置的安全性。

使用Web.config配置文件进行应用程序配置,极大的加强了应用程序的扩展性和灵活性,对于配置文件的更改也能够立即的应用于ASP.NET应用程序中。

2.Web.config配置文件的结构

Web.config配置文件是基于XML文件类型的文件,所以Web.config文件同样包含XML结构中的树形结构。在ASP.NET应用程序中,所有的配置信息都存储在Web.config文件中的“<configuration>”配置节中。在此配置节中,包括配置节处理应用程序声明,以及配置节设置两个部分,其中,对处理应用程序的声明存储在configSections配置节内,示例代码如下所示。

??? <configSections>

????? <sectionGroup

????????? name="system.web.extensions"

????????? type="System.Web.Configuration.SystemWebExtensionsSectionGroup,

????????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

??????? <sectionGroup

????????? name="scripting"

????????? type="System.Web.Configuration.ScriptingSectionGroup,

????????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

????????? <section

?? ???????name="scriptResourceHandler"

????????? type="System.Web.Configuration.ScriptingScriptResourceHandlerSection,

????????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"

????????? requirePermission="false" allowDefinition="MachineToApplication"/>

????????? <sectionGroup

????????? name="webServices"

????????? type="System.Web.Configuration.ScriptingWebServicesSectionGroup,

????????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

????????? </sectionGroup>

??????? </sectionGroup>

????? </sectionGroup>

??? </configSections>?

配置节设置区域中的每个配置节都有一个应用程序声明。节处理程序是用来实现ConfigurationSection接口的.NET Framework类。节处理程序生命中包括了配置设置接的名称,以及用来处理该配置节中的应用程序的类名。

配置节设置区域位于配置节处理程序声明区域之后。对配置节的设置还包括子配置节的是配置,这些子配置节同父配置节一起描述一个应用程序的配置,通常情况下这些同父配置节由同一个配置节进行管理,示例代码如下所示。

????? <pages>

??????? <controls>

????????? <add tagPrefix="asp" namespace="System.Web.UI"

????????? assembly="System.Web.Extensions,

????????? Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

????????? <add tagPrefix="asp" namespace="System.Web.UI.WebControls"

????????? assembly="System.Web.Extensions,

????????? Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

??????? </controls>

????? </pages>

虽然Web.config配置文件是基于XML文件格式的,但是在Web.config配置文件中并不能随意的自行添加配置节或者修改配置节的位置,例如pages配置节就不能存放在configSections配置节之中。在创建Web应用程序时,系统通常会自行创建一个Web.config配置文件在文件中,系统通常已经规定好了Web.config配置文件的结构。

13.2.3 ?ASP.NET基本配置节

在Web.config配置文件中包括很多的配置节,这些配置节都用来规定ASP.NET应用程序的相应属性。

1.<configuration>:根配置节

所有Web.config的根配置节都存储与<configuration>标记中,在它内部封装了其他的配置节,示例代码如下所示。

<configuration>

????????? <syste.web>

????????? ……

</configuration>

2.<configSections>:处理声明配置节

该配置节主要用于自定义的配置节处理程序声明,该配置节由多个“<section>”配置节组成,示例代码如下所示。

??? <configSections>

????? <sectionGroup

????? name="system.web.extensions"

????? type="System.Web.Configuration.SystemWebExtensionsSectionGroup,

????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

??????? <sectionGroup name="scripting"

????? type="System.Web.Configuration.ScriptingSectionGroup,

????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">

????????? <section name="scriptResourceHandler"

????? type="System.Web.Configuration.ScriptingScriptResourceHandlerSection,

????? System.Web.Extensions, Version=3.5.0.0, Culture=neutral,

????? PublicKeyToken=31BF3856AD364E35"

????? requirePermission="false" allowDefinition="MachineToApplication"/>

??????? </sectionGroup>

????? </sectionGroup>

??? </configSections>?

其中<section>配置节包括name和type两种属性,name属性指定配置数据配置节的名称,而type属性指定与name属性相关的配置处理程序类。

3.<appSettings>:用户自定义配置节

“<appSettings>”配置节为开发人员提供ASP.NET应用程序的扩展配置,通过使用“<appSettings>”配置节能够自定义配置文件,示例代码如下所示。

??? <appSettings>

??????? <add key="Name" value="Guojing"/>??????????????????????????????????????????????????????????????????????????? //增加自定义配置节

??????? <add key="E-mail" value="soundbbg@live.cn"/>

??? </appSettings>

上述代码添加了两个自定义配置节,这两个自定义配置节分别为Name和E-mail,用于定义该Web应用程序的开发者的信息,以便在其他页面中使用该配置节。

若需要在页面中使用该配置节,可以使用ConfigurationSettings.appSettings(“key的名称”)方法来获取自定义配置节中的配置值,示例代码如下所示。

??????? protected void Page_Load(object sender, EventArgs e)

??????? {

??????????? TextBox1.Text = ConfigurationSettings.AppSettings["name"].ToString();?????? //获取自定义配置节

??????? }

“<appSettings>”配置节包括两个属性,分别为Key和Value。Key属性指定自定义属性的关键字,以方便在应用程序中使用该配置节,而Value属性则定义该自定义属性的值。

4.<customErrors>:用户错误配置节

该配置节能够指定当出现错误时,系统自动跳转到一个错误发生的页面,同时也能够为应用程序配置是否支持自定义错误。“<customErrors>”配置节包括两种属性,这两种属性分别为mode和defaultRedirect。其中mode包括3种状态,这三种状态分别为On、Off和RemoteOnly。On表示启动自定义错误;Off表示不启动自定义错误;RemoteOnly表示给远程用户显示自定义错误。另外:defaultRedirect属性则配置了当应用程序发生错误时跳转的页面。

“<customErrors>”配置节还包括子配置节“<error>”,该标记用于特定状态的自定义错误页面,子标记“<error>”包括两个属性,分别为statusCode和redirect,其中statusCode用于捕捉发生错误的状态码,而redirect指定发生该错误后跳转的页面,该配置节配置代码如下所示。

??? <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">

?? ?????<error statusCode="403" redirect="NoAccess.htm" />

?? ?????<error statusCode="404" redirect="FileNotFound.htm" />

??? </customErrors>

上述代码则在Web.config文件中配置了相应的customErrors信息。当出现404错误时,系统会自行跳转到FileNotFound.htm页面以提示404错误,开发人员能够编写FileNotFound.htm页面进行用户提示。

5.<globalization>:全局编码配置节

“<globalization>”用于配置应用程序的编码类型,ASP.NET应用程序将使用该编码类型分析ASPX等页面,常用的编码类型包括:

q? UFT-8:Unicode UTF-8字节编码技术,ASP.NET应用程序默认编码。

q? UTF-16:Unicode UTF-16字节编码技术。

q? ASCII:标准的ASCII编码规范。

q? Gb2312:中文字符Gb2312编码规范。

在配置“<globalization>”配置节时,其编码类型可以参考上述编码类型,如果不指定编码类型,则ASP.NET应用程序默认编码为UTF-8,示例代码如下所示。

??????? <globalization fileEncoding="UTF-8" requestEncoding="UTF-8" responseEncoding="UTF-8"/>

6.<sessionState>:Session状态配置节

<sessionState>配置节用于完成ASP.NET应用程序中会话状态的设置,<sessionState>配置节包括以下5种属性:

q? mode:指定会话状态的存储位置,一共有Off、Inproc、StateServer和SqlServer集中设置,Off表示禁用该设置,Inproc表示在本地保存会话状态,StateServer表示在服务器上保存会话状态,SqlServer表示在SQL Server保存会话设置。

q? stateConnectionString:用来指定远程存储会话状态的服务器名和端口号。

q? sqlConnectionString:用来连接SQL Server的连接字符串,当在mode属性中设置SqlServer时,则需要使用到该属性。

q? Cookieless:指定是否使用客户端cookie保存会话状态。

q? Timeout:指定在用户无操作时超时的时间,默认情况为20分钟。

<sessionState>配置节配置示例代码如下所示。

??????? <sessionState mode="InProc" timeout="25" cookieless="false"></sessionState>

ASP.NET不仅包括这些基本的配置节,还包括其他高级的配置节,高级的配置节通常用于指定界面布局样式,如母版页、默认皮肤、以及伪静态等高级功能。

13.3 ?ASP.NET缓存功能

通常Web应用程序会处理大量的交互,在这些大量的交互中必然会造成频繁的数据处理。当Web应用程序中数据处理过于频繁时,会造成Web应用程序假死的状态,不仅如此,大量的重复请求还可能造成Web应用程序性能低下,这里就需要使用缓存减轻服务器压力。

13.3.1? 缓存概述

为了防止不必要的数据处理,ASP.NET允许开发人员将页面或数据进行缓存处理,当用户再次访问页面时,如果存在缓存则直接从缓存中获取用户信息或页面信息然后直接显示在客户端浏览器。这种缓存方式能够减少频繁的数据处理,减轻服务器压力。

1.应用程序缓存

应用程序缓存通过使用编程实现键/值对将任意数据存储在内存空间中。使用应用程序缓存与使用应用程序状态的方法类似。但是,与应用程序状态不相同,应用程序缓存中的数据是容易丢失的,应用程序缓存并不是在整个运行过程中都存在,应用程序缓存有一定的超时时间,当时间超过缓存设定的时间,缓存会自动注销。

2.页面输出缓存

在用户访问一个页面时,通常需要进行数据操作,例如网站的首页或其他信息页面,常常需要检索数据库中的数据并显示到页面中。如果每个用户的每次访问都需要进行一次数据操作的话,则当大量用户访问并进行数据操时将会导致性能降低甚至造成死锁。

为了避免这种情况的出现,可以使用页面输出缓存。页面输出缓存允许开发人员将整页进行数据缓存。页面输出缓存对于那些不经常更改的但需要处理大量数据和事件的页面特别适用。

3.缓存依赖

可以将缓存中的某一项的生存期配置为依赖于其他应用程序配置节,如某个文件或者数据库。当缓存依赖项被更改时,ASP.NET将从缓存中移除对该项的数据缓存。例如网站静态页面,如果该页面数据需要进行缓存,可以保存为一个HTML文件,当页面被请求时,页面首先会判断是否有缓存依赖,如果存在,则执行相应的方法进行数据显示,当HTML文件被更改或被移除后,页面再次被请求,则会创建一个缓存依赖。

13.3.2 ?页面输出缓存

当用户访问页面时,整个页面将会被服务器保存在内存中,这样就对页面进行了缓存。当用户再次访问该页,页面不会再次执行数据操作,页面首先会检查服务器中是否存在缓存,如果缓存存在,则直接从缓存中获取页面信息,如果页面不存在,则创建缓存。

页面输出缓存适用于那些数据量较多,而不会进行过多的事件操作的页面,如果一个页面需要执行大量的事件更新,以及数据更新,则并不能使用页面输出缓存。使用@OutputCatch指令能够声明页面输出缓存,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="none" %>

上述代码使用@OutputCatch指令声明了页面缓存,该页面将被缓存120秒。@OutputCatch指令包括10个属性,通过这些属性能够分别为页面的不同情况进行缓存设置,常用的属性如下所示:

q? CacheProfile:获取或设置OutputCacheProfile名称。

q? Duration:获取或设置缓存项需要保留在缓存中的时间。

q? VaryByHeader:获取或设置用于改变缓存项的一组都好分隔的HTTP标头名称。

q? Location:获取或设置一个值,该值确定缓存项的位置,包括Any、Clint、Downstream、None、Server和ServerAndClient。默认值为Any。

q? VaryByControl:获取或设置一簇分好分隔的控件标识符,这些标识符包含在当前页或用户控件内,用于改变当前的缓存项。

q? NoStore:获取或设置一个值,该值确定是否设置了“Http Cache-Control:no-store”指令。

q? VaryByCustom:获取输出缓存用来改变缓存项的自定义字符串列表。

q? Enabled:获取或设置一个值,该值指示是否对当前内容启用了输出缓存。

q? VaryByParam:获取查询字符串或窗体POST参数的列表。

通过设置相应的属性,可以为页面设置相应的缓存,当需要为Default.aspx设置缓存项时,可以使用VaryByParam属性进行设置,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="none" %>

上述代码使用了Duration属性和VarByParam属性设置了当前页的缓存属性。为一个页面进行整体的缓存设置往往是没有必要的,常常还会造成困扰,例如Default.aspx?id=1和Default.aspx?id=100在缓存时可能呈现的页面是相同的,这往往不是开发人员所希望的。通过配置VarByParam属性能够指定缓存参数,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="id" %>

上述代码则通过参数id进行缓存,当id项不同时,ASP.NET所进行的页面缓存也不尽相同。这样保证了Default.aspx?id=1和Default.aspx?id=100在缓存时所显示的页面并不一致。VarByHeader和VarByCustom主要用于根据访问页面的客户端对页面的外观或内容进行自定义。在ASP.NET中,一个页面可能需要为PC用户和MOBILE用户呈现输出,因此可以通过客户端的版本不同来缓存不同的数据,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="none" VaryByCustom="browser" %>

上述代码则为每个浏览器单独设置了缓存条目。

13.3.3 ?页面部分缓存

整页缓存在很多情况是不可行的,例如在留言本程序中。当用户第一次访问该页面,该页面就会被缓存在服务器内存中,当用户进行评论并进行刷新,当前页面还在缓存的生存周期中,页面不会立即显示刚才用户发表的评论,这种情况可能造成用户困扰。在这种情况下,就应该针对页面中不同的部分进行缓存,如对用户评论框进行缓存或数据绑定控件进行和HTML控件进行缓存,这样也可以减少数据操作次数。示例代码如下所示

<%@ OutputCache Duration="120" VaryByParam="*"%>

上述代码将缓存用户控件120秒,并且将针对查询字符串的每个变动进行缓存。

<%@ OutputCache Duration="120" VaryByParam="none" VaryByCustom="browser" %>

上述代码针对浏览器设置缓存条目并缓存120秒,当浏览器不同时,则会分别创建独立的缓存条目。

<%@ OutputCache Duration="120"

VaryByParam="none" VaryByCustom="browser" VaryByControl="TextBox1"%>

上述代码将服务器控件TextBox1的每个不同的值进行缓存处理。页面部分缓存是指输出存在页面的某些部分,而不是缓存整个页面的内容。页面部分缓存包括3种方法:

q? 使用@OutputCatch指令声明方式为用户控件设置缓存功能。

q? 在代码隐藏文件中使用PartialCachingAttribute类设置用户控件缓存。

q? 使用ControlCachePolicy类以编程的方式指定用户缓存。

页面部分缓存与页面缓存在很多方面都很相似,其属性基本相同,页面部分缓存主要使用@ OutputCache对象的属性进行缓存设置。

当对页面进行页面缓存时,通常需要针对不同的POST参数进行缓存,如果不针对参数单独的进行缓存,则形成应用程序错误,而这种错误不是逻辑上的错误,如http://localhost/Default.aspx?user=guojing所呈现的页面和http://localhost/Default.aspx?user=wujunmin会给用户呈现相同的页面,就会导致用户困扰。使用VaryByParam属性可以解决这个问题,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="name"%>

当存在多个POST参数时,可以用都好分隔,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="name"%>

当需要为每个执行的变动进行缓存时,可以使用*进行缓存设置,示例代码如下所示。

<%@ OutputCache Duration="120" VaryByParam="*"%>

页面部分缓存通常应用于用户控件而不是Web窗体,除了Location属性,支持所有OutputCache属性。用户控件还支持名为VaryByControl的OutputCatch属性,该属性将根据用户控件的成员的值改变该控件的缓存。如果一个用户控件不随应用程序中的页面而改变,则需要使用Shared=”true”参数。

13.3.4? 应用程序数据缓存

应用程序缓存是由Cache类实现的,每个应用程序对象可以专用一个缓存实例。缓存生存期依赖于应用程序的生存期,如果应用程序重启,则会重新创建Cache对象。

1.创建Cache对象

应用程序数据缓存是由System.Web.Caching.Cache类实现。该类提供了简单的字典接口。通过这个接口可以设置缓存的有效期、依赖项以及优先级等特性。Cache对象的属性如下所示:

q? Count:获取存储在缓存中的Cache对象的项数。

q? Item:获取或设置指定外键的缓存项。

Cache对象的方法如下所示。

q? Add:将指定的项添加到Cache对象,该对象具有依赖项,过期和优先级策略,以及一个委托。

q? Get:从Cache对象检索指定项。

q? Remove:从应用程序的Cache对象移除指定项。

q? Insert:向Cache对象插入一个新项。

Cache方法最简单的赋值方法就是使用一个键并为其赋值,示例代码如下所示。

??????????? Cache["key"] = "value";?????????????????????????????????????????????????????????????????????????????????????????????????????? //创建缓存项

增加缓存同样可以使用Cache对象的Add方法向缓存添加项。Add方法能够设置与Insert方法相同的所有选项。使用Add方法将返回添加到缓存中的对象,如果在缓存中已经存在该项,则Add方法不会替换该项,所以该操作不会产生异常。

使用Add方法需要为Add方法传递参数,这些参数包括依赖项、过期时间和缓存的优先级策略等。若只需要实现创建Cache方法,推荐使用Cache对象的Insert方法,示例代码如下所示。

??????????? Cache.Insert("key", "value");????????????????????????????????????????????????????????????????????????????????????????????? //插入缓存项

上述代码将在缓存中存储项,但是上述代码不带任何的依赖项,所以该缓存不会到期,除非缓存引擎为了给其他的缓存数据提供空间而将其删除,如果需要创建包含依赖项的缓存,则需要使用Add方法。

2.创建带依赖项的Cache对象

创建Cache对象可以通过依赖项创建对象,使用Cache.Insert方法创建缓存不带任何依赖项,所以该缓存不会到期。如果需要创建带依赖项的Cache对象,可以使用Cache.Insert方法的重载函数,示例代码如下所示。

?????? Cache.Insert("key","xml file value",

?????? new System.Web.Caching.CacheDependency(Server.MapPath("XmlData.xml")));??????????????? //插入缓存项

上述代码将“xml file value”字符创插入缓存,无需在以后的请求中从文件读取缓存信息。CacheDependency的作用是确保缓存在文件更改后立即到期,从而能够从文件中提取最新的数据进行数据缓存,如果缓存数据来自若干个文件,还可以指定一个文件名数组,示例代码如下所示。

?????? string[] dependencies = { "CacheItem1", "CacheItem2", "CacheItem3" };????????????????????????? //指定数组

?????? Cache.Insert("key","xml file value",

??? ???new System.Web.Caching.CacheDependency(null,dependencies));?????????????????????????????? //插入缓存项

创建带依赖项的Cache对象时,可以同时创建多个依赖项。该Cache对象向缓存中名为CacheItem1等数组配置节的另一项添加依赖项,同时也向XmlData.xml文件添加文件依赖项,示例代码如下所示。

?? ????System.Web.Caching.CacheDependency

?? ????mydep1 = new System.Web.Caching.CacheDependency(Server.MapPath("XmlData.xml"));?????? //创建缓存

?? ????string[] Mydependencies = { "CacheItem1", "CacheItem2", "CacheItem3" };????????????????????????????? //创建数组

?? ????System.Web.Caching.CacheDependency

?? ????mydep2 = new System.Web.Caching.CacheDependency(null, Mydependencies);???????????????????????? //创建依赖

?? ????System.Web.Caching.AggregateCacheDependency

? ?????aggDep = new System.Web.Caching.AggregateCacheDependency();?????????????????????????????????????????????? //创建依赖

?? ????aggDep.Add(mydep1);?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //增加依赖

???? ??aggDep.Add(mydep2);

?? ????Cache.Insert("Cache", "CacheItem", aggDep);???????????????????????????????????????????????????????????????????????????????? //插入缓存

上述代码创建了Cache对象,并向CacheItem1等数组配置节的另一项添加依赖项,同时也向XmlData.xml文件添加文件依赖项。

13.3.5 ?检索应用程序数据缓存对象

要从缓存中检索数据,应指定存储缓存项的键。由于缓存中所存储的信息容易丢失,即该缓存信息有可能被ASP.NET移除,因此开发人员首先应该确定该项是否已经存在与缓存,如果不存在缓存,则首先应该创建一个缓存项,然后再检索该项。示例代码如下所示。

??????????? string cache = Cache["key"].ToString();???????????????????????????????????????????????????????????????????????????????????????????? //获取缓存

??????????? if (cache != null)??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //判断缓存

??????????? {

??????????????? Response.Write(cache);????????????????????????????????????????????????????????????????????????????????????????????????????? //输出缓存

??????????? }

??????????? else

??????????? {

??????????????? Cache["key"] = "value";??????????????????????????????????????????????????????????????????????????????????????????????????????? //创建缓存

??????????????? Response.Write(Cache["key"].ToString());?????????????????????????????????????????????????????????????????????? //输出缓存

??????????? }

上述代码从缓存项“key”中获取缓存的值,如果缓存的值为空置,则创建一个缓存。使用Cache类的Get方法也可以获取被缓存的数据对象,如果通过Get方法返回缓存中的数据对象,则返回的类型为object类型,示例代码如下所示。

??????????? string cache = Cache["key"].ToString();???????????????????????????????????????????????????????????????????????????????????????????? //获取缓存

??????????? if (cache != null)??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? //判断缓存

??????????? {

??????????????? Response.Write(cache);????????????????????????????????????????????????????????????????????????????????????????????????????? //输出缓存

??????????? }

??????????? else

??????????? {

??????????????? Cache["key"] = "value";??????????????????????????????????????????????????????????????????????????????????????????????????????? //创建缓存

??????????????? Response.Write(Cache.Get("key").ToString());?????????????????????????????????????????????????????????????? //Get缓存

??????????? }

Cache类的Get方法可以获取被缓存的数据对象,如果使用Cache类的GetEnumerator方法则返回一个IDictionaryEnumerator对象,该对象可以用于循环访问包含在缓存中的键值设置及其值的枚举类型。示例代码如下所示。

??????????? IDictionaryEnumerator cacheEnum = Cache.GetEnumerator();??????????????????????????????????????? //定义枚举

??????????? while (cacheEnum.MoveNext())??????????????????????????????????????????????????????????????????????????????????????????????? //遍历枚举

??????????? {

??????????????? cache = Server.HtmlEncode(cacheEnum.Current.ToString());?????????????????????????????????? //输出缓存

??????????????? Response.Write(cache);

??????????? }

上述代码则通过使用Cache类的GetEnumerator方法则返回一个IDictionaryEnumerator对象给cacheEnum变量,并通过cacheEnum变量的MoveNext方法进行缓存遍历。

13.4? 小结

本章讲解了ASP.NET内置对象,包括如何创建ASP.NET内置对象和使用ASP.NET内置对象。Web应用程序从本质上来讲是无状态的,为了维持客户端的状态,必须使用ASP.NET内置对象进行客户端状态维护,这些状态包括Session、Cookies等。本章还包括:

q? ASP.NET内置对象:包括Session、Cookies等内置对象。

q? ASP.NET应用程序配置:包括ASP.NET应用程序配置。

q? Web.config配置文件:讲解了Web.config配置文件中常用的属性。

q? 应用程序数据缓存:讲解了应用程序数据缓存。

q? 检索应用程序数据缓存对象:讲解了从缓存中获取应用程序数据。

本章还讲解了缓存中的Cache对象和Web.config配置节,开发人员能够快速的构建ASP.NET应用环境并进行性能优化。

读书人网 >ASP

热点推荐