缓存 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 属性访问该方法。

注意:
如果您使用 @ OutputCache 指令设置页的可缓存性,则必须声明 Duration 属性,另外还必须声明 VaryByControl 属性,或同时声明 VaryByParam 属性和 Location 属性。必须将 Duration 属性设置为大于零的值。如果不希望使用 VaryByParam 或 VaryByControl 参数的功能,可以将 VaryByParam 属性设置为“None”。有关更多信息,请参见如何:设置 ASP.NET 页缓存的过期时间值和缓存页的多个版本。
 

作为使用 @ OutputCache 指令设置页可缓存性的替换方法,可以在应用程序的 Web.config 文件中创建缓存配置文件,然后在页中引用该配置文件。

  

某页或用户控件的可缓存性指某页能否在其响应生命周期内缓存到某个设备上。这些设备包括发出请求的客户端(浏览器),响应请求的 Web 服务器,以及请求或响应流中任何具有缓存功能的设备(例如代理服务器)。

如果您在设计时知道某页需要什么样的可缓存性设置,您可以以声明方式设置可缓存性。该页将为所有请求使用相同的可缓存性设置。

以声明方式设置 ASP.NET 页的可缓存性


在页中包含 @ OutputCache 指令,并定义 Duration 和 VaryByParam 属性。

在 @ OutputCache 指令中包含 Location 属性,并将其值定义为 OutputCacheLocation 枚举中的下列值之一:Any、Client、Downstream、Server、ServerAndClient 或 None。

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

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

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

使用缓存配置文件以声明方式设置页的可缓存性
在应用程序的 Web.config 文件中定义缓存配置文件,在配置文件中包括 duration 和 varyByParam 设置。

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


<caching>
  <outputCacheSettings>
    <outputCacheProfiles>
      <add name="Cache30Seconds" duration="30"
        varyByParam="none" />
    </outputCacheProfiles>
  </outputCacheSettings>
</caching>
 

在使用配置文件的每个 ASP.NET 页中包含 @ OutputCache 指令,并将 CacheProfile 属性设置为 Web.config 文件中定义的缓存配置文件的名称。

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


<%@ OutputCache CacheProfile="Cache30Seconds" %>
 

以编程方式设置页的可缓存性

在页的代码中,调用 Response 对象的 Cache 属性的 SetCacheability 方法。

下面的代码将 Cache-Control HTTP 标头设置为 Public。

C#
Response.Cache.SetCacheability(HttpCacheability.Public);

Response.Cache.SetCacheability(HttpCacheability.Public)
 

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

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

以编程方式检查缓存页的有效性

用户请求缓存页时,ASP.NET 根据您在该页中定义的缓存策略来确定缓存输出是否仍然有效。如果缓存输出有效,则将输出发送到客户端,并且不重新处理该页。但是,ASP.NET 提供了使用验证回调在该验证检查期间运行代码的功能,因此您可以编写自定义逻辑来检查该页是否有效。利用验证回调,可以使在使用缓存依赖项的正常进程之外的缓存页无效。

1.定义 HttpCacheValidateHandler 类型的事件处理程序,并包括检查缓存页响应的有效性的代码。

验证处理程序必须返回下列 HttpValidationStatus 值之一:

Invalid   指示缓存页无效,将从缓存中移除该页,并且该请求将被作为缓存未命中处理。

IgnoreThisRequest   导致将请求视为缓存未命中处理。因此,将重新处理该页,但不会使缓存页无效。

Valid   指示缓存页有效。

下面的代码示例阐释名为 ValidateCacheOutput 的验证处理程序,该处理程序确定查询字符串变量 status 包含值“invalid”还是“ignore”。如果状态值为“invalid”,则该方法返回 Invalid,并且使该页在缓存中无效。如果状态值为“ignore”,则该方法返回 IgnoreThisRequest,并且该页仍保留在缓存中,但为该请求生成一个新响应。

C# 
public static void ValidateCacheOutput(HttpContext context, Object data,
        ref HttpValidationStatus status)
{
    if (context.Request.QueryString["Status"] != null)
    {
        string pageStatus = context.Request.QueryString["Status"];

        if (pageStatus == "invalid")
            status = HttpValidationStatus.Invalid;
        else if (pageStatus == "ignore")
            status = HttpValidationStatus.IgnoreThisRequest;
        else
            status = HttpValidationStatus.Valid;
    }
    else
        status = HttpValidationStatus.Valid;
}
 


Visual Basic 
Public Shared Sub ValidatePage(ByVal context As HttpContext, _
        ByVal data As [Object], ByRef status As HttpValidationStatus)
    If Not (context.Request.QueryString("Status") Is Nothing) Then
        Dim pageStatus As String = context.Request.QueryString("Status")

        If pageStatus = "invalid" Then
            status = HttpValidationStatus.Invalid
        ElseIf pageStatus = "ignore" Then
            status = HttpValidationStatus.IgnoreThisRequest
        Else
            status = HttpValidationStatus.Valid
        End If
   Else
       status = HttpValidationStatus.Valid
   End If
End Sub
 

2.从其中一个页生命周期事件(如页的 Load 事件)中调用 AddValidationCallback 方法,将您在步骤 1 中定义的事件处理程序作为第一个参数传递。

下面的代码示例将 ValidateCacheOutput 方法设置为验证处理程序。

C#  
protected void Page_Load(object sender, EventArgs e)
{
    Response.Cache.AddValidationCallback(
        new HttpCacheValidateHandler(ValidateCacheOutput),
        null);
}
 


Visual Basic 
Protected Sub Page_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.Load

    Response.Cache.AddValidationCallback( _
        New HttpCacheValidateHandler(AddressOf ValidatePage), Nothing)
End Sub
 

原文地址:https://www.cnblogs.com/llbofchina/p/1389211.html