ASP.NET缓存_缓存 ASP.NET 页

ASP.NET 使您可以缓存 ASP.NET 页所生成的部分响应或所有响应,在 ASP.NET 中将这种技术称为输出缓存。可以在发出请求的浏览器、响应请求的 Web 服务器以及请求或响应流中任何其他具有缓存功能的设备(如代理服务器)上缓存页。缓存为您提供了一个强有力的方式来提高 Web 应用程序的性能。缓存功能允许利用缓存满足对页的后续请求,这样就不需要再次运行最初创建该页的代码。对站点中访问最频繁的页进行缓存可以充分地提高 Web 服务器的吞吐量(通常以每秒的请求数计算)。
可以在页或配置文件中以声明方式或者通过编程方式使用缓存 API 指定缓存设置。可以根据查询字符串参数值或窗体变量值(控件值)缓存页。必须通过使用 @ OutputCache 指令的 VaryByParam 属性,显式启用基于这些类型的值的缓存。当用户请求某一缓存页时,ASP.NET 根据已经为该页定义的缓存策略确定其缓存输出是否仍有效。如果该输出有效,则将该缓存输出发送到客户端,并且不重新处理该页。ASP.NET 允许您在此验证检查期间运行代码,以便可以编写用于检查页是否有效的自定义逻辑。有时,缓存整个页是不切实际的,因为在每次请求时可能需要更改页的某些部分。在这些情况下,可以缓存页的一部分。ASP.NET 提供了只缓存 ASP.NET 页的几部分的功能。
以声明方式设置 ASP.NET 页的可缓存性
某页或用户控件的可缓存性指某页能否在其响应生命周期内缓存到某个设备上。这些设备包括发出请求的客户端(浏览器),响应请求的 Web 服务器,以及请求或响应流中任何具有缓存功能的设备(例如代理服务器)。
如果您在设计时知道某页需要什么样的可缓存性设置,您可以以声明方式设置可缓存性。该页将为所有请求使用相同的可缓存性设置。
以声明方式设置页的可缓存性
1.        在页中包含 @ OutputCache 指令,并定义 Duration 和 VaryByParam 属性。
2.        在 @ OutputCache 指令中包含 Location 属性,并将其值定义为 OutputCacheLocation 枚举中的下列值之一:Any、Client、Downstream、Server、ServerAndClient 或 None。
下面的代码演示如何将页的可缓存性设置为 60 秒:
 
<%@ OutputCache Duration="60" VaryByParam="None"%>
注意
默认设置为 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" %>
l         以编程方式设置页的可缓存性
页或用户控件的可缓存性指的是某一页是否能在该页的响应生命周期内缓存在某个设备上。缓存页的这些设备包括发出请求的浏览器,响应请求的 Web 服务器,以及请求或响应流中任何可执行缓存的设备,如代理服务器。
如果应用程序将根据运行时条件(如读取请求标头)确定可缓存性,您可以通过编程方式设置可缓存性。
以编程方式设置页的可缓存性
·                 在页的代码中,调用 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 方法设置的值。
 
l         设置 ASP.NET 页缓存的过期时间值
若要导致某一页添加到输出缓存中,需要为该页建立到期策略。这可以通过以声明方式或编程方式来实现。
以声明方式为页设置输出缓存到期时间
·                 将 @ OutputCache 指令包括在您要缓存其响应的 ASP.NET 页(.aspx 文件)中。将 Duration 属性设置为一个正数值,将 VaryByParam 属性设置为一个值。
注意
默认情况下,@ OutputCache 指令将 Cache-Control 标头设置为 Any。
例如,下面的 @ OutputCache 指令将页的到期时间设置为 60 秒:
 
<%@ OutputCache Duration="60" VaryByParam="None" %>
注意
在使用 @ OutputCache 指令时,必须包括一个 VaryByParam 属性,否则将出现分析器错误。如果不希望使用 VaryByParam 属性提供的功能,请将它的值设置为“None”。
以编程方式为页设置输出缓存到期时间
·                 在该页的代码中,在 Response 对象的 Cache 属性中设置该页的到期策略。
注意
如果以编程方式设置页的到期时间,则您还必须为缓存的页设置 Cache-Control 标头。为此,请调用 SetCacheability 方法并向其传递 HttpCacheability 枚举值 Public。
下面的代码示例设置与前面过程中的 @ OutputCache 指令相同的缓存策略。
C# 
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(true);
当缓存页到期时,以后对该页的请求将导致动态生成的响应。会在指定的持续时间内缓存该响应页。
 
l         检查缓存页的有效性
户请求缓存页时,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;
}
2.        从其中一个页生命周期事件(如页的 Load 事件)中调用 AddValidationCallback 方法,将您在步骤 1 中定义的事件处理程序作为第一个参数传递。
下面的代码示例将 ValidateCacheOutput 方法设置为验证处理程序。
C# 
protected void Page_Load(object sender, EventArgs e)
{
    Response.Cache.AddValidationCallback(
        new HttpCacheValidateHandler(ValidateCacheOutput),null);
}
 
l         使用文件依赖项缓存页输出
有时候,您可能需要在文件发生更改时从输出缓存中移除某一页。例如,您可能有这样一页:该页从生成 XML 文件作为输出且占用大量进程的报告中获取其内容。仅当 XML 文件发生更改时,才需要重新处理该页。要将重新处理限制为仅在需要的时候进行,可以使页的缓存策略依赖于单个文件。如有必要,可以使缓存页依赖于多个文件。
注意
通过调用 RemoveOutputCacheItem 方法,可显式移除输出缓存中的任何页。可以从 Global.asax 文件、自定义 ASP.NET 服务器控件或页中执行此操作,具体取决于应用程序的需要。
使缓存页输出依赖于一个文件
1.        以声明方式或编程方式指定缓存页输出的设置。
2.        在页代码中调用 AddFileDependency 方法。将创建依赖项的文件的路径作为方法的 filename 参数传递。
下面的代码示例在 TextFile1.txt 文件上设置一个文件依赖项。当文件发生更改时,将从缓存中移除页输出。
C# 
protected void Page_Load(object sender, EventArgs e)
{
    string fileDependencyPath = Server.MapPath("TextFile1.txt");
    Response.AddFileDependency(fileDependencyPath);
 
    // Set additional properties to enable caching.
   Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
    Response.Cache.SetCacheability(HttpCacheability.Public);
    Response.Cache.SetValidUntilExpires(true);
}
 
注意
不能从 ASP.NET 用户控件使用这些方法。但是,在指定 @ OutputCache 指令的任何用户控件中,您都可以创建一个文件依赖项,并将其分配给 Dependency 属性。
使缓存页输出依赖于文件组
1.        以声明方式或编程方式指定缓存页输出的设置。
2.        在页代码中,创建一个包含该页所要依赖的文件的路径的 String 数组或 ArrayList。
3.        调用 AddFileDependencies 方法,并将数组作为 filenames 参数传递。
下面的代码示例创建包含 TextFile1.txt 和 XMLFile1.xml 文件的文件路径的字符串数组,并使页输出依赖于这两个文件。如果修改了其中任何一个文件,将从缓存中移除页输出。
C# 
protected void Page_Load(object sender, EventArgs e)
{
    string[] fileDependencies;
    string fileDependency1 = Server.MapPath("TextFile1.txt");
    string fileDependency2 = Server.MapPath("XMLFile1.xml");
    fileDependencies = new String[] { fileDependency1,
        fileDependency2 };
    Response.AddFileDependencies(fileDependencies);
}
 
l         使用缓存键依赖项缓存页输出
有时,当缓存中的某一项被移除时,您可能需要从输出缓存中移除一页。例如,您可能使用一页来显示放置在应用程序缓存中并供多个页使用的占用大量进程的报告。当该报告已更改或已从缓存中移除时,您希望将页输出也从缓存中移除,因为该报告不再有效。为此,可使缓存的页输出依赖于其他缓存项。
注意
通过调用 RemoveOutputCacheItem 方法,可显式移除输出缓存中的任何页。可以从 Global.asax 文件、自定义 ASP.NET 服务器控件或页中执行此操作,具体取决于应用程序的需要。
使缓存的页输出依赖于另一缓存项
1.        在页中,以声明方式或编程方式指定缓存设置。
2.        在页代码中调用 AddCacheItemDependency 方法。将创建依赖项的缓存项的名称作为 cacheKey 参数传递。
下面的代码示例演示如何在名为 ProcessIntensiveReport 的项上设置依赖项。当此项被修改或移除时,将从缓存中移除页输出。
C# 
复制代码
protected void Page_Load(object sender, EventArgs e)
{
    Response.AddCacheItemDependency("ProcessIntensiveReport");
 
    // Set additional properties to enable caching.
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
    Response.Cache.SetCacheability(HttpCacheability.Public);
    Response.Cache.SetValidUntilExpires(true);
}
 
注意
不能在 ASP.NET 用户控件中调用 AddCacheItemDependency 方法。不过,在指定 @ OutputCache 指令的任何用户控件中,都可以创建描述缓存键依赖项的 CacheDependency 对象,并将其分配给 UserControl 对象的 Dependency 属性。
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值