分享

整理了一下MSDN中关于ASP.NET缓存机制的论述 - qdzx2008的专栏 - CS...

 thy 2009-03-24
    Response.Write(t); %>





下面的代码示例演示了包括在页中的用户控件。控件的缓存持续时间设置为 50 秒。




<% @Control language="C#" %>
<% @OutputCache duration="50" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>





不过,如果页的输出缓存持续时间比用户控件的输出缓存持续时间短,则即使已为某个请求
重新生成该页的其余部分,也将一直缓存用户控件直到其持续时间到期为止。例如,如果页
的输出缓存设置为 50 秒,而用户控件的输出缓存设置为 100 秒,则页的其余部分每到期
两次,用户控件才到期一次。


下面的代码演示了一个页的标记,该页中包含的用户控件的缓存持续时间长于该页的缓存
持续时间。该页配置为缓存 50 秒。




<%@ Page language="C#" %>
<%@ Register tagprefix="SampleControl" tagname="Time" src="uc2.ascx" %>
<%@ OutputCache duration="50" varybyparam="none" %>
<SampleControl:Time runat="server" /><br /> <br /> <br />
This page was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>





下面的代码演示了包括在页中的用户控件。控件的缓存持续时间设置为 100 秒。




<% @Control language="C#" %>
<% @OutputCache duration="100" varybyparam="none" %>
This user control was most recently generated at:<p>
<% DateTime t = DateTime.Now.ToString();
Response.Write(t); %>



(七)以声明方式设置 ASP.NET 页的可缓存性 
设置页的可缓存性 
页或用户控件的可缓存性是指是否可以在页的响应生命周期内在设备上缓存页。可缓存页的设备
包括发出请求的浏览器、响应请求的 Web 服务器以及请求或响应流中其他任何具有缓存功能的设备,
如代理服务器。
当 Web 服务器向请求浏览器发送响应时,服务器会在响应的 HTTP 头中包含一个 Cache-Control 
字段,该字段定义可以缓存该页的设备。根据您应用程序的需要,可以分别定义哪些设备应该或不应缓
存各个 ASP.NET 页。例如,您可能希望用户登录页的可缓存性设置不同于显示产品选择的目录页的
对应设置。对于登录页,出于安全方面的考虑,您可能希望只将页缓存到服务器上,而目录页可以缓存
到任何设备上。
对于 ASP.NET 页,可以使用 HttpCacheability 枚举中的值设置可缓存性。该枚举具有下列值。
前三个值与 Cache-Control HTTP 头设置直接对应,后三个值为特殊值。
NoCache 指定发出请求的设备每次应从 Web 服务器获取响应。
Public 允许由客户端和共享(代理)缓存来缓存响应。
Private 指定响应只能在客户端上缓存,而不能由共享(代理服务器)缓存来缓存。
Server 指定仅在原始服务器上缓存响应。
ServerAndNoCache 应用 Server 和 NoCache 两者的设置,以指示在该服务器上缓存内容,
但显式拒绝其他所有服务器缓存响应的功能。
ServerAndPrivate 指定仅在原始服务器和请求客户端上缓存响应;不允许代理服务器缓存响应。
您可以通过在 @ OutputCache 指令中包含 Location 属性并指定 OutputCacheLocation 
枚举值之一,以声明的方式设置页的可缓存性。还可以使用 SetCacheability 方法为页指定
HttpCacheability 值,从而以编程方式设置该页的可缓存性。可以通过 Response 类的 Cache
属性访问该方法。

 

  1. 在页中包含 @ OutputCache 指令,并定义 DurationVaryByParam 属性。

  2. @ OutputCache 指令中包含 Location 属性,并将其值定义为 OutputCacheLocation
    枚举中的下列值之一:AnyClientDownstreamServerServerAndClientNone

    下面的代码演示如何将页的可缓存性设置为 60 秒:

    <%@ OutputCache Duration="60" VaryByParam="None"%>
    Note注意

    默认设置为 Any。如果未定义 Location 属性,则可以将页输出缓存在与响应有关的所有具有缓存功能的网络设备上。其中包括请求客户端、原服务器、以及响应通过的任何代理服务器。

使用缓存配置文件以声明方式设置页的可缓存性

  1. 在应用程序的 Web.config 文件中定义缓存配置文件,在配置文件中包括 duration
    varyByParam 设置。

    下面的 <caching> 配置元素定义名为 Cache30Seconds 的缓存配置文件,它将在服务器
    上将页缓存 30 秒之久。

    <caching>
        <outputCacheSettings>
        <outputCacheProfiles>
        <add name="Cache30Seconds" duration="30"
        varyByParam="none" />
        </outputCacheProfiles>
        </outputCacheSettings>
        </caching>
  2. 在使用配置文件的每个 ASP.NET 页中包含 @ OutputCache 指令,并将 CacheProfile
    属性设置为 Web.config 文件中定义的缓存配置文件的名称。

    下面的代码指定页应当使用名为 Cache30Seconds 的缓存配置文件:

    <%@ OutputCache CacheProfile="Cache30Seconds" %>
(八)以编程方式设置页的可缓存性
  在页的代码中,调用 Response 对象的 Cache 属性的 SetCacheability 方法。
  • 下面的代码将 Cache-Control HTTP 标头设置为 Public

    Response.Cache.SetCacheability(HttpCacheability.Public);
        

    如果将 NoCacheServerAndNoCache 传递到 SetCacheability 方法以防止请求的
    浏览器在它自己的历史记录文件夹中缓存某一页,那么任何时候当某个用户单击“后退”或
    “前进”按钮时,都会请求响应的新版本。通过调用 Cache 属性的
    SetAllowResponseInBrowserHistory 方法,并且为 allow 参数传递 true 值,
    您可以按条件重写此行为。

    如果将可缓存性设置为除 NoCacheServerAndNoCache 之外的任何值,ASP.NET
    将忽略由 SetAllowResponseInBrowserHistory 方法设置的值。

(九)设置 ASP.NET 页缓存的过期时间值 

 

若要导致某一页添加到输出缓存中,需要为该页建立到期策略。这可以通过以声明方式或编程方式来实现。

以声明方式为页设置输出缓存到期时间

  • @ OutputCache 指令包括在您要缓存其响应的 ASP.NET 页(.aspx 文件)中。将 Duration 属性设置为一个正数值,将 VaryByParam 属性设置为一个值。

    Note注意

    默认情况下,@ OutputCache 指令将 Cache-Control 标头设置为 Any

    例如,下面的 @ OutputCache 指令将页的到期时间设置为 60 秒:

    <%@ OutputCache Duration="60" VaryByParam="None" %>
    Note注意

    在使用 @ OutputCache 指令时,必须包括一个 VaryByParam 属性,否则将出现分析器错误。如果不希望使用 VaryByParam 属性提供的功能,请将它的值设置为“None”。有关更多信息,请参见缓存页的多个版本

以编程方式为页设置输出缓存到期时间

  • 在该页的代码中,在 Response 对象的 Cache 属性中设置该页的到期策略。

    Note注意

    如果以编程方式设置页的到期时间,则您还必须为缓存的页设置 Cache-Control 标头。为此,请调用 SetCacheability 方法并向其传递 HttpCacheability 枚举值 Public

    下面的代码示例设置与前面过程中的 @ OutputCache 指令相同的缓存策略。

    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
        Response.Cache.SetCacheability(HttpCacheability.Public);
        Response.Cache.SetValidUntilExpires(true);

    当缓存页到期时,以后对该页的请求将导致动态生成的响应。会在指定的持续时间内缓存该响应页。

  •  

(十)动态更新缓存页的部分 

 

对页面进行缓存可以大大提高 Web 应用程序的性能。不过,在有些情况下,需要缓存页面的大部分内容,但页面中的某些片段是动态的。例如,如果创建一个页面,其中的新闻故事在设定时间段内完全是静态的,则可以设置为缓存整个页面。如果希望提供在每次页请求时都发生变化的交替出现的广告横幅,则该页中包含该广告的部分需要是动态的。

若要允许缓存某个页面但动态地替换其中的某些内容,可以使用 ASP.NET 缓存后替换。通过使用缓存后替换,将对整个页面进行输出缓存,并将特定的部分标记为不进行缓存。在广告横幅示例中,AdRotator 控件使您可以利用缓存后替换功能,以便为每个用户及在每次刷新页时动态创建广告。

有三种方法可以实现缓存后替换:

  • 以声明方式使用 Substitution 控件。

  • 以编程方式使用 Substitution 控件 API。

  • 以隐式方式使用 AdRotator 控件。

Substitution 控件

ASP.NET Substitution 控件指定缓存页中动态创建而不进行缓存的部分。将 Substitution 控件放置在该页上要显示动态内容的位置。

在运行时,Substitution 控件调用使用 MethodName 属性指定的方法。该方法必须返回一个字符串,然后该字符串替换 Substitution 控件的内容。该方法必须是 PageUserControl 包含控件上的静态方法。

使用 Substitution 控件可以将客户端可缓存性更改为服务器可缓存性,以便该页面不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。

Substitution API

若要以编程方式为缓存页创建动态内容,可以在页代码中将某个方法的名称作为参数传递给 WriteSubstitution 方法来调用该方法。该方法处理动态内容的创建,它采用单个 HttpContext 参数并返回一个字符串。该返回字符串是将在给定位置被替换的内容。通过调用 WriteSubstitution 方法来代替以声明方式使用 Substitution 控件的一个好处是可以调用任意对象的方法,而不只是调用 PageUserControl 对象的静态方法。

调用 WriteSubstitution 方法可以将客户端可缓存性更改为服务器可缓存性,以便该页不会在客户端上进行缓存。这样可以确保以后对该页的请求能够再次调用该方法以生成动态内容。

AdRotator 控件

AdRotator 服务器控件在内部实现对缓存后替换的支持。如果将 AdRotator 控件放在页面上,则无论是否缓存父页,都将在每次请求时呈现其特有的广告。因此,包含 AdRotator 控件的页面只在服务器端进行缓存。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多