当一个网页频繁被访问的时候,我们可以通过把整个网页缓存来提高执行效率。这样作的优点是,当用户再次访问这个网页的时候,被格式化好的HTML会被直接送显。
为什么会存在这种效果呢?我们通过ASP.NET的基本运行机制来解释这个问题。ASP.NET是一个动态的服务器,当用户从客户端提供一个请求的时候,那么服务端的IIS接受到请求,然后根据用户的提示执行相应的代码。执行代码之后生成一个结果。这个结果会被缓存成一个HTML放在Server 端,然后通过响应用户的Request将这个HTML传送到客户端。在这之中我们发现,很多时候,用户的请求实际上并没有多大的变化,可能请求的都是相同的内容。这时候执行一次代码的成本就会相当的高。既然我们已经生成了一个HTML,我们何必要在重新执行一次代码呢?我们直接把HTML送显就可以了。
Output Cache是一项非常有效的增强访问性能的技术,由于IIS的一些特性,默认情况下Output Cache是打开的,但是要对一些请求进行缓存,还需要开发者进行定制。
定制Output Caching
对于Output Caching的定制,我们有两种方法,一种是基于底层的API技术,一种是基于高层的@Output Caching,一旦Output Caching被定制过,那么这个网页就会在第一次被访问的时候生成cache,直到请求过期为止。
我们着重点是使用高层的@Output Caching标签来设置,因为API技术的编程难度比较大,和ASP.NET快速编程理念不相符。
代码示例:通过使用Output Cache定义一个缓存页,显示当前时间,大家可以看到,当这个页面被缓存之后,刷新时,当前时间显示不发生变化。
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
TimeMsg.Text = DateTime.Now.ToString();
}
</script>//head以前。
protected void Page_Load(object sender, EventArgs e)
{
TimeMsg.Text = DateTime.Now.ToString();
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
示例讲解
在这个页面中<%@ Output Cache Duration = “60” VaryByParam = “none”%>
这段话定义了页面将要被缓存,并且,其缓存时间为60秒,并在一个页面被缓存之后,通过定义VaryByParam属性,它不会因为request接受的参数而改变,只有在60秒之后,页面自动清除缓存,此时,第一个访问提供了新的缓存。
代码示例:数据访问的小示例,相对显示当前数据示例,这个示例更能显示缓存页之后刷新的性能优势。
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
TimeMsg.Text = DateTime.Now.ToString();
}
</script>//head以前。
protected void Page_Load(object sender, EventArgs e)
{
TimeMsg.Text = DateTime.Now.ToString();
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_De
fault" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>//最上面
由参数改变缓存内容
有些时候我们需要根据用户的请求来生成页面,但是用户的请求只有有限的几种组合,这个时候就可以根据用户请求来生成几种缓存页面,来进行缓存。
代码示例:接受参数示例,根据用户选择不同的Name显示不同的数据库内容。最开始部分:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ OutputCache Duration="60" VaryByParam="Name" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
TimeMsg.Text = DateTime.Now.ToString("G");
}
</script>
Body内容:
<span style="font-family: Verdana">Using the Output Cache</span><b>Authors by Name:</b>
<table cellpadding="3" cellspacing="0" rules="all" style="border-left-color: black;
border-bottom-color: black; width: 700px; border-top-color: black; border-collapse: collapse;
background-color: #aaaadd; border-right-color: black">
<tr>
<td>
<a href="Default.aspx?Name=李阳">1</a></td>
<td>
<a href="Default.aspx?Name=陈胜">2</a></td>
<td>
<a href="Default.aspx?Name=夏秘密">3</a></td>
<td>
<a href="Default.aspx?Name=范玲玲">4</a></td>
</tr>
</table>
<br />
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1">
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ Connecti
onStrings:qimuConnectionString %>"
SelectCommand="SELECT * FROM [tab1] WHERE ([Name] = @Name)">
<SelectParameters>
<asp:QueryStringParameter Name="Name" QueryStringField="Name" DefaultValue=
"李阳" />
</SelectParameters>
</asp:SqlDataSource>
<br />
<em>Last generated on:</em>
<asp:Label ID="TimeMsg" runat="server"></asp:Label>
显示效果:
Using the Output CacheAuthors by Name:
1 |
2 |
3 |
4 |
ID |
Name |
Sex |
1 |
李阳 |
男 |
接受参数示例解说
关键语句<%@ Output Cache Duration = “60” VaryByParam = “Name”%>
上面显示一个数据库查询示例,并在页面下端放置一个访问的当前时间显示,可以清楚的看到,对于每个不同的参数,一分钟之内的访问会得到同一个时间戳,这表明用户在这个时间内访问的视同一个cache。
注意:不足是在60秒以内数据库做出改变,不能显示更新的显示,需要处理这个问题还需要其他的设置。
硬盘Output Cache
默认情况下,Output Cache会被缓存到硬盘上。我们可以通过修改diskcacheenable的属性来设置其是否缓存,还可以通过在web config里配置缓存文件的大小。
在使用程序的时候,我们常用内存缓存和交换区缓存,硬盘缓存技术我们可能用的不是很多,因为觉得硬盘速度慢,或者交互起来有问题。实际上,由于服务器现在占用内存都比较多,尤其是大型的应用。所以在IIS服务默认是把硬盘服务是打开的。
使用DiskOutput Cache示例:
<%@ OutputCache Duration="3600" VaryByParam="name" DiskCacheable="true" %>
Web.Config文件中,
<configuration>
<appSettings/>
<system.web>
<caching>
<outputCache>
<diskCache enabled="true" maxSizePerApp="2"(2M) />
</outputCache>
<outputCacheSettings>
<outputCacheProfiles>
<add name="CacheFor60Seconds" duration="60" />
</outputCacheProfiles>
</outputCacheSettings>
<!--
<sqlCacheDependency enabled="true" pollTime="1000" >
<databases>
<add name="PubsDB" connectionStringName="pubsConnectionString" />
</databases>
</sqlCacheDependency>
-->
</caching>
</system.web>
</configuration>
设置DiskOutput属性。
指定硬盘缓存时,指定时间要相应的大一些。硬盘访问速度相对慢一点。(VS 2005正式版已经删除了这一个功能,汗!)
回调缓存
通过设置回调缓存机制,可以针对每个请求在页面中插入动态的部分,以弥补单独使用静态缓存的不足。
代码示例:
回调缓存示例
Code
<%@ Page Language="VB" %>
<%@ OutputCache Duration="60" VaryByParam="none" %>
<script runat="server">
Shared Function GetCurrentDate(ByVal context As HttpContext) As String
Return Now.ToString()
End Function
</script>
<html>
<head id="Head1" runat="server">
<title>Post Cache Substitution</title>
</head>
<body>
<fom id="form1" runat="server">
<h4>
This page uses post cache substitution to insert a dynamic value into a cached page.</h4>
<p>
Time:
<%= DateTime.Now.ToString() %>
</p>
<p>
<b>Real Time:
<asp:Substitution ID="Substitution1" runat="server" MethodName="GetCurrentDate" />
</b>
</p>
</form>
</body>
</html>