利用缓存,可以极大提高web应用程序的性能。
ASP.NET页面中执行最慢的操作是数据库的访问。打开一个数据库连接并读取数据是很慢的操作。改进性能的最好方法是改进访问数据的代码而不是访问数据库的代码。
ASP.NET 2.0 Framework支持下列类型的缓存:
·页面输出缓存
·局部页面缓存
·数据源缓存
·数据缓存
使用页面输出缓存
可以给一个页面添加<% OutputCache %>指令启动页面输出缓存。例如,下面代码使得输出的页面能缓存15秒。
<%@ Page Language="C#" %>
<%@ OutputCache Duration="15" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
lblTime.Text = DateTime.Now.ToString("T");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Cache Page Output</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label
id="lblTime"
Runat="server" />
</div>
</form>
</body>
</html>
使用参数改变输出缓存
有时候我们同一个页面在根据传入的不同参数时会显示不同的内容,如果这种情况使用上面的缓存就会导致传入任何不用参数都会显示相同的缓存内容,这个时候可以使用VaryByParam属性来解决这个问题。VaryByParam属性会在传入不用参数时使页面缓存新的实例。
<%@ OutputCache Duration="3600" VaryByParam="id" %>
传入的参数名称为id。
可以给VaryByParam属性赋两个特殊的值。
none——传入的参数都被忽略了,只有一个版本的页面缓存;
*——传入参数的任意变化都会创建一个新版本的页面缓存。
如果希望根据不只一个参数值的变化来创建不用的页面缓存版本,那么可以用分号分隔一组参数列表给VaryByParam属性。
基于控件变化的输出缓存
VaryByControl属性用于根据页面中的特定控件的不同值来创建不用版本的页面缓存。
<%@ OutputCache Duration="3600" VaryByControl="dropCategories" %>
<asp:DropDownList
id="dropCategories"
DataSourceID="srcCategories"
DataTextField="Name"
DataValueField="Id"
Runat="server" />
基于头变化的输出缓存
还有一个选择是使用VaryByHeader属性,使得在特定浏览器头的值变化时,可以创建不用版本的缓冲页面。
几个标准的浏览器头在每次页面请求时都会传递,这些头包含:
Accept-Language——代表请求页面中用户最希望的有优先级顺序的人类语言列表;
User-Agent——代表请求页面设备的类型;
Cookie——代表当前域名下创建的浏览器的cookie。
基于浏览器变化的输出缓存
如果想针对不用浏览器使用不用缓存版本,可以使用VaryByCustom属性。该属性接受一个特殊的browser值。当VaryByCustom的值为browser时,浏览器的类型和主版本号被认为重要并需要考虑的。
设置缓存位置
使用<% Outputcache%>指令的Location属性指定页面被缓存在哪里。该属性包含下面值:
Any——页面被缓存在浏览器、代理服务器端和web服务器端;
Client——缓存在浏览器;
DownStream——页面被缓存在浏览器和任何的代理服务器端;
None——页面不缓存;
ServerAndClient——页面被缓存在浏览器和web服务器端;
创建页面输出缓存文件依赖
可以在一个缓存页面和硬盘上的一个文件(或者一组文件)之间创建一个依赖。当文件修改时,缓存页面自动失效并在下次页面请求时重新生成。
<%@ Page Language="C#" %>
<%@ OutputCache Duration="9999" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
Response.AddFileDependency(MapPath("Movies.xml"));
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Output Cache File Dependency</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
<hr />
<asp:GridView
id="grdMovies"
DataSourceID="srcMovies"
Runat="server" />
<asp:XmlDataSource
id="srcMovies"
DataFile="Movies.xml"
Runat="server" />
</div>
</form>
</body>
</html>
上面代码显示了当前时间,注意,时间直到Movies.xml文件被修改时才会变化。代码中使用了 Response.AddFileDependency()方法在缓存页面和磁盘上的单个文件间建立了依赖。如果需要依赖多个文件,则需要使用AddFileDependencies()代替。
使用编程的方式设置页面输出缓存过期
可以使用Response.RemoveOutputCacheItem()方法,以编程的方法,从缓存中移除一个页面。例如我们前台产品页面被缓存了,当在后台添加新的产品时就可以使用编程方式移除前台缓存的产品页面。
protected void dtlMovie_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
HttpResponse.RemoveOutputCacheItem(Page.ResolveUrl("~/MovieList.aspx"));
Response.Redirect("~/MovieList.aspx");
}
创建页面输出缓存配置
通过在Web配置文件中配置页面输出缓存,从而将这些配置应用于多个页面。可以创建一个缓存配置(Cache Profile),将使网站的缓存更容易管理。
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Cache1Hour" duration="3600" varyByParam="none" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
下面代码使用了Cache1Hour配置。该配置设置于<% OutputCache%>指令的CacheProfile属性。
<%@ Page Language="C#" %>
<%@ OutputCache CacheProfile="Cache1Hour" %>
<!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 id="Head1" runat="server">
<title>Output Cache Profile</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%= DateTime.Now.ToString("T") %>
</div>
</form>
</body>
</html>
可以给缓存配置设置和独立页面的<%OutputCache%>指令一样的属性。