1. 云栖社区>
  2. 技术文集>
  3. 列表>
  4. 正文

ASP.NET 2.0中的页面输出缓存

作者:用户 来源:互联网 时间:2016-07-07 19:42:09

缓存页面sqldependency属性指令输出参数输出绝对过期时间缓存时间输出值缓存输出OutputCache输出不缓存输出缓存

ASP.NET 2.0中的页面输出缓存 - 摘要: 本文讲的是ASP.NET 2.0中的页面输出缓存, asp.net|缓存|页面   静态页面全部内容保存在服务器内存中。当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期。这个过程中,缓存不需要再

asp.net|缓存|页面   静态页面全部内容保存在服务器内存中。当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期。这个过程中,缓存不需要再次经过页面处理生命周期。这样可以缩短请求响应时间,提高应用程序性能。很显然,页面输出缓存适用于不需要频繁更新数据,而占用大量时间和资源才能编译生成的页面。对于那些数据经常更新的页面,则不适用。默认情况下,ASP.NET 2.0启用了页面输出缓存功能,但并不缓存任何响应的输出。开发人员必须通过设置,使得某些页面的响应成为缓存的一部分。

  设置页面输出缓存可以使用以下两种方式:一种是使用@ OutputCache指令,另一种是使用页面输出缓存API。@ OutputCache指令曾经在ASP.NET 1.x中出现过,并在ASP.NET 2.0中得到了继承和增强。页面输出缓存API主要是指HttpCachePolicy类。

  使用@ OutputCache指令

  使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要。@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明。这种方式非常方便,只需几个简单的属性设置,就能够实现页面的输出缓存策略。@ OutputCache指令声明代码如下。


@ OutputCache指令代码

<%@ OutputCache CacheProfile=" " NoStore="True | False" Duration="#ofseconds" Shared="True | False" Location="Any | Client | Downstream | Server | None | ServerandClient " SqlDependency="database/table name pair | CommandNotification " VaryByControl="controlname" VaryByCustom="browser | customstring" VaryByHeader="headers" VaryByParam="parametername" %>

  如上所示,在@ OutputCache指令中,共包括10个属性,它们是CacheProfile、NoStore、Duration、Shared、Location、SqlDependency、VaryByControl、VaryByCustom、VaryByHeader和VaryByParam。这些属性将对缓存时间、缓存项的位置、SQL数据缓存依赖等各方面进行设置。下面简要介绍以上属性的基本概念。

  ASP.NET 2.0中的页面输出缓存- CacheProfile

  用于定义与该页关联的缓存设置的名称。是可选属性,默认值为空字符("")。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。在页面中指定此属性时,属性值必须与Web.config文件<outputCacheSettings>配置节下的outputCacheProfiles元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

  ASP.NET 2.0中的页面输出缓存- NoStore

  该属性定义一个布尔值,用于决定是否阻止敏感信息的二级存储。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。

  ASP.NET 2.0中的页面输出缓存- Duration

  用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。

  ASP.NET 2.0中的页面输出缓存- Shared

  该属性定义一个布尔值,用于确定用户控件输出是否可以由多个页共享。默认值为false。注意,包含在ASP.NET页中的@ OutputCache指令不支持此属性。

  ASP.NET 2.0中的页面输出缓存- Location

  用于指定输出缓存项的位置。其属性值是OutputCacheLocation枚举值,它们是Any、Client、Downstream、None、Server和ServerAndClient。默认值是Any,表示输出缓存可用于所有请求,包括客户端浏览器、代理服务器或处理请求的服务器上。需要注意的是,包含在用户控件中的@ OutputCache指令不支持此属性。

  ASP.NET 2.0中的页面输出缓存- SqlDependency

  该属性标识一组数据库/表名称对的字符串值,页或控件的输出缓存依赖于这些名称对。需要注意:SqlCacheDependency类监视输出缓存所依赖的数据库中的表,因此,当更新表中的项时,使用基于表的轮询将从缓存中移除这些项。当通知(在SQL Server 2005中)与CommandNotification值一起使用时,最终将使用SqlDependency类向SQL Server 2005服务器注册查询通知。另外,SqlDependency属性的CommandNotification值仅在ASP.NET页中有效。控件只能将基于表的轮询用于@ OutputCache指令。

  ASP.NET 2.0中的页面输出缓存- VaryByControl

  该属性使用一个分号分隔的字符串列表来更改用户控件的输出缓存。这些字符串代表在用户控件中声明的ASP.NET服务器控件的ID属性值。除非已经包含了VaryByParam属性,否则在@ OutputCache指令中,该属性是必需的。

  ASP.NET 2.0中的页面输出缓存- VaryByCustom

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

  ASP.NET 2.0中的页面输出缓存- VaryByHeader

  该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本。VaryByHeader属性在所有HTTP 1.1缓存中启用缓存项,而不仅限于ASP.NET缓存。用户控件中的@ OutputCache指令不支持此属性。

  ASP.NET 2.0中的页面输出缓存- VaryByParam

  该属性定义了一个分号分隔的字符串列表,用于使输出缓存发生变化。默认情况下,这些字符串与用GET方法属性发送的查询字符串值对应,或与用POST方法发送的参数对应。当将该属性设置为多参数时,对于每个指定的参数,输出缓存都包含一个请求文档的不同版本。可能的值包括“none”、“*”和任何有效的查询字符串或POST参数名称。值得注意的是,在输出缓存ASP.NET页时,该属性是必需的。它对于用户控件也是必需的,除非已经在用户控件的@ OutputCache指令中包含了VaryByControl属性。如果没有包含,则会发生分析器错误。如果不需要使缓存内容随任何指定参数发生变化,则可将该值设为“none”。如果要使输出缓存根据所有参数值发生变化,则将属性设置为“*”。

  下面列举了两个使用@OutputCache指令的示例代码。


使用@ OutputCache的示例代码1

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

  以上示例是@ OutputCache指令的基本应用,其指示页面输出缓存的有效期是100秒,并且页面不随任何GET或POST参数改变。在该页仍被缓存时接收到的请求由缓存数据提供服务。经过100秒后,将从缓存中移除该页数据,并随后显式处理下一个请求并再次缓存页。


使用@ OutputCache的示例代码2

<%@ OutputCache Duration="100" VaryByParam="location;firstname" %>


  以上@ OutputCache指令设置页面输出缓存的有效期是100秒,并且根据查询字符串参数location或者firstname来设置输出缓存。例如,假设客户端请求是“http://localhost/default.aspx?location=beijing”,那么该页面将被作为缓存处理。

  使用页面输出缓存API

  上文介绍了使用@ OutputCache指令实现对于输出缓存的各项设置。这种方法简单易行,深得开发人员青睐。另外,ASP.NET 2.0还从ASP.NET 1.x中继承和扩展了一种使用输出缓存API来编程设置页面输出缓存的方法。该方法的核心是调用System.Web.HttpCachePolicy。该类主要包含用于设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。与.NET Framework 1.x中的HttpCachePolicy类相比,.NET Framework 2.0中的HttpCachePolicy类得到了扩充和发展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy类方法众多,下面简要说明一些常用方法。

  ASP.NET 2.0中的页面输出缓存- SetExpires方法

  用于设置缓存过期的绝对时间。它的参数是一个DataTime类的实例,表示过期的绝对时间。

  ASP.NET 2.0中的页面输出缓存- SetLastModified方法

  用于设置页面的Last-Modified HTTP标头。Last-Modified HTTP标头表示页面上次修改时间,缓存将依靠它来进行计时。如果违反了缓存限制层次结构,此方法将失败。该方法的参数是一个DataTime类的实例。

  ASP.NET 2.0中的页面输出缓存- SetSlidingExpiration方法

  该方法将缓存过期从绝对时间设置为可调时间。其参数是一个布尔值。当参数为true时,Cache-Control HTTP标头将随每个响应而更新。此过期模式与相对于当前时间将过期标头添加到所有输出集的IIS配置选项相同。当参数为false时,将保留该设置,且任何启用可调整过期的尝试都将静态失败。此方法不直接映射到HTTP标头。它由后续模块或辅助请求来设置源服务器缓存策略。

  ASP.NET 2.0中的页面输出缓存- SetOmitVaryStar方法

  ASP.NET 2.0新增的方法。用于指定在按参数进行区分时,响应是否应该包含vary:*标头。方法参数是一个布尔值,若要指示HttpCachePolicy不对其VaryByHeaders属性使用*值,则为true;否则为false。

  ASP.NET 2.0中的页面输出缓存- SetCacheability方法

  用于设置页面的Cache-Control HTTP标头。该标头用于控制在网络上缓存文档的方式。该方法有两种重载方式,所不同的是参数。一种重载方法的参数是HttpCacheability枚举值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有关这些枚举值的定义,可参考MSDN)。另一种方法的参数有两个,一个参数是HttpCacheability枚举值,另一个参数是字符串,表示添加到标头的缓存控制扩展。需要注意的是,仅当与Private或NoCache指令一起使用时,字段扩展名才有效。如果组合不兼容的指令和扩展,则此方法将引发无效参数异常。

  下面举例说明页面缓存API的HttpCachePolicy类的使用方法。


HttpCachePolicy类示例源代码
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));

  Response类的Cache属性用于获取页面缓存策略。该属性的数据类型是HttpCachePolicy。可通过调用Response.Cache来获取HttpCachePolicy实例,进而实现对于当前页面输出缓存的设置。如上代码所示,第一行代码表示输出缓存时间是60秒,并且页面不随任何GET或POST参数改变,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代码设置缓存过期的绝对时间是当日下午6时整。

  页面输出缓存应用

  以上两小节分别介绍了使用@ OutputCache指令和API设置页面输出缓存功能的内容。实际上,两种方法各有优点,使用@ OutputCache指令方法比较简洁,但灵活性较差。使用API方法,能够在运行时动态地修改缓存配置,处理更多的复杂需求。本节将利用这些知识,实现一个简单的页面输出缓存应用的示例,其中既涉及@ OutputCache指令应用,又涉及页面输出缓存API。示例效果如图12-1和图12-2所示。

ASP.NET 2.0中的页面输出缓存-ASP.NET 2.0中的页面输出缓存-

图1 停止缓存的效果图 图12-2 执行缓存的效果图

  如图1所示,应用程序初始显示的是停止执行缓存的时间。当用户刷新页面(URL地址是http://localhost:5159/Code%2012-1/Default.aspx,其中5159是服务器临时端口号)时,时间值将随时变化,以便显示当前的最新时间。如图12-2所示,单击“缓存时间”超链接后,页面重定向到http://localhost:5159/Code%2012-1/Default.aspx?location=beijing。这时,页面显示的时间被缓存,数据过期时间为5秒。如果不断地刷新该页,那么每隔5秒钟时间值才变化一次。

  本节示例存在两个关键点。一是在运行时实现停止缓存,二是配置@ OutputCache指令。这两点都已经在应用程序Default.aspx文件中予以实现,下面列举了该文件源代码。


Default.aspx文件源代码

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ OutputCache Duration="5" VaryByParam="location" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

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

<script language="C# " runat="server">

void Page_Load(object sender, EventArgs e)

{

//设置仅将缓存数据存储在服务器上

Response.Cache.SetCacheability(HttpCacheability.Server);

string temp_location = Request.QueryString["location"];

//如果location为空则不缓存否则根据@ OutputCache指令声明执行缓存

if (temp_location == null)

{

//停止当前响应的所有服务器缓存

Response.Cache.SetNoServerCaching();

Label1.Text = "停止缓存的时间" + DateTime.Now.ToString();

}

else

{

Label1.Text = "设置了缓存的时间" + DateTime.Now.ToString();

}

}

</script>

<head id="Head1" runat="server">

<title>示例12-1</title>

<link id="InstanceStyle" href="StyleSheet.css" type="text/css" rel="stylesheet" />

</head>

<body>

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

<div>

<fieldset style="width: 240px">

<legend class="mainTitle">设置页面输出缓存</legend>

<br />

<center><asp:Label ID="Label1" runat="server" CssClass="commonText"></asp:Label></center>

<br />

<a href="Default.aspx?location=beijing" class="littleMainTitle" >缓存时间</a><br />

</fieldset>

</div>

</form>

</body>

</html>

  如上粗体代码所示,代码头部的@ OutputCache指令设置了Duration和VaryByParam属性,其指示数据过期时间为5秒。同时,缓存根据参数location发生变化。另外,代码还实现了Page_Load事件处理程序。在该程序中,首先,使用SetCacheability方法设置数据缓存必须存储在服务器上,然后,获取QueryString的location参数值,最后,根据location参数值进行判断。如果location参数值为空,则调用SetNoServerCaching方法停止当前响应的所有服务器缓存,并显示当前时间值。虽然@ OutputCache指令配置了页面输出缓存,但是,不会执行页面输出缓存功能。如果location参数值不为空,则直接显示当前时间值。在这种情况下,将执行@ OutputCache指令的配置内容。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有 的相关内容,欢迎继续使用右上角搜索按钮进行搜索缓存 , 页面 , sqldependency , 属性 , 指令 , 输出参数 , 输出 , 绝对过期时间 , 缓存时间 , 输出值 , 缓存输出 , OutputCache , 输出不缓存 输出缓存 ,以便于您获取更多的相关知识。

asp.net中word导出页面,如何把动态生成的图片也导出word中

...何能把生成的图片也导出word里面呢,如果是显示到页面中的话生成的图片是能显示的,但是导入word中的时候就不行了 这是代码 应该怎么才能把图片导出word中呢 解决方案 将asp页面导出到WORDasp.net 页...

ASP.NET 2.0中的页面输出缓存_实用技巧

...部内容保存在服务器内存中。当再有请求时,系统将缓存中的相关数据直接输出,直到缓存数据过期。这个过程中,缓存不需要再次经过页面处理生命周期。这样可以缩短请求响应时间,提高应用程序性能。很显然,页面输出缓...

从 PHP 迁移到 ASP.NET

...SP.NET 并不是一种语言或分析器,而是 Microsoft .NET Framework 中的一组用于构建 Web 应用程序和 XML Web Service 的技术。同 PHP 一样,Microsoft ASP.NET 页面在服务器上执行并生成标记(例如 HTML、WML 或 XML),标记将发送给桌面应用程序或...

asp:ScriptManager(转) - 风铃儿

...何要发送到浏览器的定制脚本。部分页面输出,这使页面中的某个区域可以不依赖于回送就可以刷新。ASP.NET AJAX  的 UpdatePanel 、UpdateProgress 和 Timer 控件需要 ScriptManager 控件来支持局部输出。Web 服务的 Javascript 代理,这使客户端...

在ASP.NET AJAX中别使用mode="Legacy"

...部更新的情形。 当你打开你的web.config文件,你会看到其中的 元素,象这样: 背景: ASP.NET 1.0 和 1.1 中的许多服务器端控件并不输出与XHTML兼容的标识。ASP.NET 2.0 对此做了改变,在默认情形下,所有的服务器端控件都会输...

前三篇
后三篇