您的位置:首页 > 编程语言 > ASP

ASP.NET 缓存系列----页面缓存

2013-04-11 16:21 260 查看

2.1页面输出缓存

页面输出缓存是一种使应用程序能够更快地显示更多页面的简单方法。它既没有复杂的缓存策略,也没有优异的代码设计。换句话说,它使用应用程序能够更快地显示多个页面,但是没有提高应用程序的效率和可扩展性。通过使用页面输出缓存,就可以减少服务器的工作荷载,因为页面是向下进行缓存的。

2.1.1@OutPutCache指令

只需要在页面的顶部定义一个@OutPutCach指令,就可以非常容易地缓存页面输出。该指令接受一组属性,其中以下两个属性是必须的:Duration和VaryByParam。Duration属性表示系统缓存页面输出的缓存时间(单位:秒)。VaryByParam属性允许根据GET查询字符串或者POST形参,改变所要缓存的输出。不管GET和POST参数的值是多少,以下的声明语句都将页面缓存一分钟:

示例2-1:

<%@OutPutCacheDuration=”60”VaryByParam=”None”%>

对于频繁请求的页面和相对静态的页面,@OutPutCache指令实际上是一个性能助推器。通过缓存一个较小的时间,能够使整个应用程序的执行速度得到提高。

表2-1@OutPutCache指令的属性

属性

适用对象

描述

CacheProfile

页面

使用用一个页面

与Web.Config文件中指定一组输出缓存设置相关。

Duration

页面和用户控件

页面或用户控件的缓存时间(单位:秒)

Location

页面

为存储页面的输出指定一个有效的位置。

NoStore

页面

一个布尔值,它决定了是否阻止敏感信息的二级存储。

Shared

用户控件

一个布尔值,确定用户控件输出是否可以由多个页共享。默认值为false。

SqlDependency

页面和用户控件

表示一个给定SQLServer数据库中某个指定的一个依赖对象。只要修改该表的内容,就将从缓存中删除页面输出。

VaryByControl

用户控件

一个分号分隔的字符串列表,用于更改用户控件的输出缓存。这些字符串代表用户控件中声明的ASP.NET服务器控件的ID属性值。

VaryByCustom

页面和用户控件

表示自定义输出缓存要求任意文本。如果赋予该属性值为browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入自定义字符串,则必须在应用程序Global.asax文件重写GetVaryByCustomString

VaryByHeader

页面

分号分隔的HTTP、标头列表,用于使输出缓存发生变化。将该属性设为多标头时,对于每个指定标头组合,输出缓存都包含一个不同版本的请求文档。

属性

适用对象

描述

VaryByParam

页面和用户控件

分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与随GET方法属性发送的查询字符串值对应,或与使用POST方法发送的参数对应。将该属性设置为多个参数时,对于每个指定参数组合,输出缓存都包含一个不同版本的请求文档。可能的值包括none、星号(*)以及任何有效的查询字符串或POST参数名称。

2.1.2Duration属性

Duration参数用于指定页面或者用户控件被缓存的秒数,在输出缓存中的项仅指定的时间片段内有效。一旦过了时间限制,缓存就会过期。在缓存过期之后,下一个缓存页或者缓存用户控件的请求将导致重新生成页面或者用户控件,而缓存将新的副本重新填充。在下面的示例中,使用OutPutCache指令的Duration属性把整个页面缓存3秒钟,在页面的Page_Load中使用当前时间填充Lable控件。OutPutCache指令是实现输出缓存的唯一必需的。该指令指定Duration为3秒钟。这意味着,如果在发出一个请求后3秒钟内,从服务器请求相同的页面,随后的请求将从缓存获得而不是有ASP.NET重新生成。

示例2-2:

<%@PageLanguage="C#"%>

<%@OutputCacheVaryByParam="None"Duration="3"%>

<scriptrunat="server">

protectedvoidPage_Load(objectsender,EventArgse)

{

Label1.Text=DateTime.Now.ToString();

}

</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

<title>无标题页</title>

</head>

<body>

<formid="form1"runat="server">

<div>

<asp:LabelID="Label1"runat="server"Text="Label"Width="228px"></asp:Label>

</div>

</form>

</body>

</html>

2.1.3VaryByParam属性

VaryByParam参数允许根据提交给服务器的参数缓存页面的不同版本。这些参数包含的有分号分隔的字符串列表中。有两个特殊的VaryByParam参数值:

2-2VaryByParam属性的参数



说明

none

不跟据参数保存不同版本

*

在缓存中,为每个查询字符串值或者表单的唯一组合保存一个页面的独立版本

为了查看VaryByParam参数,创建一个Aspx页面,并添加两个Lable控件,用于显示一个GET请求中传入的URL中的参讯字符串参数,更改Duration参数为60秒,这样将有更多的时间来浏览效果:

示例2-3:

<%@PageLanguage="C#"%>

<%@OutputCacheDuration="60"VaryByParam="*"%>

<scriptrunat="server">

protectedvoidPage_Load(objectsender,EventArgse)

{

lblTime.Text="页面加载时间:"+DateTime.Now.ToLongTimeString();

//获取URL“username”和“state”参数的值

lblUserName.Text=Request.Params["username"];

lblState.Text=Request.Params["state"];

}

</script>

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

<title>无标题页</title>

</head>

<body>

<formid="form1"runat="server">

<div>

<asp:LabelID="lblTime"runat="server"Text="Label"Width="130px"></asp:Label>

<br/>

<br/>

姓名:

<asp:LabelID="lblUserName"runat="server"Text="Label"Width="97px"></asp:Label>

<br/>

状态:

<asp:LabelID="lblState"runat="server"Text="Label"Width="95px"></asp:Label>

</div>

</form>

</body>

</html>

现在键入相同的URL,但使用不同的参数username和state,应为OutPutCache的Duration设置为了“*”,所有会在结果页面中显示不同的时间。

还可以设置VaryByParam作为需要用于缓存的参数。因此,可以仅根据state进行缓存,可以使用下面的OutPutCache指令:

示例2-4:

<%@OutputCacheDuration="60"VaryByParam="state"%>

如果须根据两个参数的唯一组合进行缓存,如state和city,可以使用下列指令:

示例2-5:

<%@OutputCacheDuration="60"VaryByParam="state;city"%>

2.1.4页面片段缓存

有时候,缓存整个页是不实际的;可能需要为每个请求动态创建页的某些部分。在这些情况下,您可能值得花时间来标识与需要大量的服务器资源来构造的页请求相关联的对象或数据。一旦标识了这些项,您就可以通过在Web窗体用户控件中创建这些项将它们从页的其他部分分离出来,然后在一段指定的时间中对这些项进行缓存,以节省服务器资源。这就是通常所说的片段缓存。

这项技术允许您将需要花宝贵的处理器时间来创建的页的某些部分(例如数据库查询)与页的其他部分分离开。您可以选择允许为每个请求动态生成需要较少服务器资源的页的部分。

一旦标识了要缓存的页的部分,并且创建了对这些部分中的每个部分进行封装的用户控件后,您必须确定这些用户控件的缓存策略。当在代码隐藏类中创建用户控件时,您可以使用指令以声明的方式设置这些策略。或使用PartialCachingAttribute类以编程方式设置这些策略。

一下示例表述一个页面片段缓存的例子,在default.aspx中添加内容之前,须添加一个新的Web用户控件到项目中,并命名为SimpleUserControl.ascx。其内容文件如下:

示例2-6:

<%@ControlLanguage="C#"AutoEventWireup="true"

CodeFile="SimpleUserControl.ascx.cs"

Inherits="SimpleUserControl_ascx"%>

<%@OutputCacheDuration="10"VaryByParam="*"%>


<hr/>

<h3>UserControl</h3>

<asp:LabelID="lblTime"runat="server"/>

<hr/>


其代码隐藏文件如下所示:

示例2-7:

usingSystem;

usingSystem.Data;

usingSystem.Configuration;

usingSystem.Collections;

usingSystem.Web;

usingSystem.Web.Security;

usingSystem.Web.UI;

usingSystem.Web.UI.WebControls;

usingSystem.Web.UI.WebControls.WebParts;

usingSystem.Web.UI.HtmlControls;

publicpartialclassSimpleUserControl_ascx:System.Web.UI.UserControl

{

protectedvoidPage_Load(objectsender,EventArgse)

{

lblTime.Text="Thisusercontrolwasloadedat"+

DateTime.Now.ToLongTimeString();

}

}

这个用户控件仅仅是在加载时显示时间。当在网页中使用它时,控件的可见部分可以包含在水平线中来显示它。OutPutCache指令指定Duration为10秒。

当用户控件创建完毕后,就可以将一些内容添加到default.aspx中,包括将用户控件放在其中。

示例2-8:

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"

Inherits="_Default"%>

<%@RegisterTagPrefix="MyUserControl"TagName="LoadTime"

Src="~/SimpleUserControl.ascx"%>


<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.1//EN"

"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">


<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

<title>FragmentCaching</title>

</head>

<body>

<formid="form1"runat="server">

<div>

<h1>FragmentCaching</h1>

<asp:LabelID="lblTime"runat="server"/>

<br/>

<MyUserControl:LoadTimerunat="server"/>

</div>

</form>

</body>

</html>

default.aspx相关隐藏文件如下:

示例2-9:

usingSystem;

usingSystem.Data;

usingSystem.Configuration;

usingSystem.Web;

usingSystem.Web.Security;

usingSystem.Web.UI;

usingSystem.Web.UI.WebControls;

usingSystem.Web.UI.WebControls.WebParts;

usingSystem.Web.UI.HtmlControls;


publicpartialclass_Default:System.Web.UI.Page

{

protectedvoidPage_Load(objectsender,EventArgse)

{

lblTime.Text="Thispagewasloadedat"+

DateTime.Now.ToLongTimeString();

}

}

注意,这个使用用户控件的页面没有实现任何缓存功能,也没有包括OutPutCache指令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: