页面输出缓存概述
页面输出缓存是一种最简单的缓存形式,将已经生成的动/静态页面的全部内容保存在服务器内存中。页输出缓存在内存中存储处理后的 ASP.NET 页的内容。这一机制允许ASP.NET向客户端发送页响应,而不必再次经过页处理生命周期。页输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用。例如,如果创建大通信量的网页来显示不需要频繁更新的数据,通过页输出缓存则可以极大地提高该页的性能。可以分别为每个页配置页缓存,也可以在Web.config文件中创建缓存配置文件。利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。
页缓存允许将页的全部内容保存在内存中,并用于完成客户端请求。部分页缓存允许缓存页的部分内容,其他部分则为动态内容。
设置页的缓存可以使用以下两种方式:一种是使用@OutputCacher指令,另一种是使用页面输出缓存API。@OutputCacher指令在ASP.NET 1.x中就已经存在,并在ASP.NET 2.0中得到了继承和增强。页面API主要是指HttpCachePolicy类。
@OutputCache指令
使用@OutputCache指令可以以声明的方式控制ASP.NET页或页中包含的用户控件的输出缓存策略,实现对页面输出缓存的一般性需要。@OutputCache在ASP.NET页或页包含的用户控件的头部声明。
语法如下:
<%@ OutputCache Duration="#ofseconds"
Location="Any | Client | Downstream | Server | None | ServerAndClient "
Shared="True | False"
VaryByControl="controlname"
VaryByCustom="browser | customstring"
VaryByHeader="headers"
VaryByParam="parametername"
%>
@OutputCache指令各属性及描述如表1所示。
表1 @OutputCache指令中的属性及说明
编号 |
属 性 名 |
说 明 | ||
1 |
Duration |
页或用户控件进行缓存的时间(以秒为单位) | ||
2 |
Location |
指定输出缓存可以使用的场所,默认值为Any。在用户控件中的@OutPutCache指令不支持此属性 | ||
3 |
Shared |
确定用户控件输出是否可以由多个页共享,默认值为False | ||
|
4 |
VaryByControl |
该属性使用一个用分号分隔的字符串列表来改变用户控件的部分输出缓存 | |
|
5 |
VaryByCustom |
根据自定义的文本来改变缓存内容 | |
|
6 |
VaryByHeader |
根据HTTP头信息来改变缓冲区内容 | |
|
7 |
VaryByParam |
该属性使用一个用分号分隔的字符串列表来改变使输出缓存发生变化 | |
(1)Duration属性
该属性设置Web页或用户控件进行缓存的时间,以秒为单位,在Web页或用户控件上设置Duration属性为请求对象的HTTP响应建立一个过期策略,并将自动缓存页或用户控件输出。Duration属性为必选属性。HttpCachePolicy类的SetExpires方法是用来确定有效期的时间,它的参数是一个DateTime类的实例,表示过期的绝对时间。
(2)Location属性
该属性的取值为OutputCacheLocation枚举值之一。OutputCacheLocation枚举成员如表2所示。
表2 OutputCacheLocation枚举成员列表
成 员 名 称 |
说 明 |
Any |
输出缓存可位于产生请求的浏览器客户端、参与请求的代理服务器(或任何其他服务器)或处理请求的服务器上。此值对应于HttpCacheability.Public枚举值 |
Client |
输出缓存位于产生请求的浏览器客户端上。此值对应于HttpCacheability.Private枚举值 |
Downstream |
输出缓存可存储在任何HTTP 1.1可缓存设备中,源服务器除外。这包括代理服务器和发出请求的客户端 |
None |
对于请求的页,禁用输出缓存。此值对应于HttpCacheability.NoCache枚举值 |
Server |
输出缓存位于处理请求的Web服务器上。此值对应于HttpCacheability.Server枚举值 |
ServerAndClient |
输出缓存只能存储在源服务器或发出请求的客户端中。代理服务器不能缓存响应。此值对应于HttpCacheability.Private和HttpCacheability.Server枚举值的组合 |
(3)Shared属性
设置一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为False。包含在ASP.NET页(.aspx文件)中的@ OutputCache指令不支持此属性。
(4)VaryByControl属性
该属性用一个分号分隔的字符串列表表示,用于更改用户控件的输出缓存。这些字符串代表用户控件中声明的ASP.NET服务器控件的ID属性值。值得注意的是,除非已经包含了VaryByParam属性,否则在用户控件@OutputCache指令中必须包括该属性。页面输出缓冲不支持此属性。
(5)VaryByCustom属性
表示自定义输出缓存要求的任意文本。如果赋予该属性的值为browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入自定义字符串,那么就必须重写在应用程序的Global.asax文件中的GetVaryByCustomString方法。
(6)VaryByHeader属性
设置VaryByHeader属性将启用在所有HTTP 1.1版缓存中缓存项,而不仅仅在 ASP.NET缓存中进行缓存。将该属性设为多标头时,对于每个指定标头组合,输出缓存都包含一个不同版本的请求文档。用户控件中的@ OutputCache指令不支持此属性。
(7)Varybyparam属性
分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与随GET方法属性发送的查询字符串值对应,或与使用POST方法发送的参数对应。将该属性设置为多个参数时,对于每个指定参数组合,输出缓存都包含一个不同版本的请求文档。可能的值包括None、“*”以及任何有效的查询字符串或POST参数名称。
在ASP.NET页和用户控件上使用@ OutputCache指令时,需要varyByParam属性或VaryByControl属性。如果没有包含它,则发生分析器错误。如果不希望通过指定参数来改变缓存内容,则将值设置为None。如果希望通过所有的参数值改变输出缓存,则将属性设置为“*”。
示例:
设置页面缓存的过期时间为当前时间加上10s
本示例演示的是当程序运行的时候,将Web页面的缓存时间设置为10s,在10s内刷新页面时,页面显示的时间不发生变化,10秒钟后再刷新页面,显示的时间将发生改变。如图1、图2所示。
图1 10秒以内的页面
图2 10秒后的页面
程序代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ OutputCache Duration ="10" VaryByParam ="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/ xhtml1- transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>@OutputCache</title>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
Response.Write("页面缓存设置示例: <br> 设置缓存时间为10s<br>当前时间为: " + DateTime.Now. ToString());
}
</script>
</head>
<body>
<form id="form1" runat="server">
</form>
</body>
</html>
程序完整代码如下:
★★★★★Default.aspx.cs代码文件的代码★★★★★
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
★★★★★Default.aspx设计文件的代码★★★★★
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ OutputCache Duration ="10" VaryByParam ="none"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>@OutputCache</title>
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
Response.Write("页面缓存设置示例: <br> 设置缓存时间为10秒<br>当前时间为: " + DateTime.Now.ToString());
}
</script>
</head>
<body>
<form id="form1" runat="server">
</form>
</body>
</html>
★★★★★web.config网站配置文件的代码★★★★★
<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
/Windows/Microsoft.Net/Framework/v2.x/Config 中
-->
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug="true"/>
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Windows"/>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>