如何:检查缓存页的有效性
更新:2007 年 11 月
用户请求缓存页时,ASP.NET 根据您在该页中定义的缓存策略来确定缓存输出是否仍然有效。如果缓存输出有效,则将输出发送到客户端,并且不重新处理该页。但是,ASP.NET 提供了使用验证回调在该验证检查期间运行代码的功能,因此您可以编写自定义逻辑来检查该页是否有效。利用验证回调,可以使在使用缓存依赖项的正常进程之外的缓存页无效。
以编程方式检查缓存页的有效性
定义 HttpCacheValidateHandler 类型的事件处理程序,并包括检查缓存页响应的有效性的代码。
验证处理程序必须返回下列 HttpValidationStatus 值之一:
Invalid 指示缓存页无效,将从缓存中移除该页,并且该请求将被作为缓存未命中处理。
IgnoreThisRequest 导致将请求视为缓存未命中处理。因此,将重新处理该页,但不会使缓存页无效。
Valid 指示缓存页有效。
下面的代码示例阐释名为 ValidateCacheOutput 的验证处理程序,该处理程序确定查询字符串变量 status 包含值“invalid”还是“ignore”。如果状态值为“invalid”,则该方法返回 Invalid,并且使该页在缓存中无效。如果状态值为“ignore”,则该方法返回 IgnoreThisRequest,并且该页仍保留在缓存中,但为该请求生成一个新响应。
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; }
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
从其中一个页生命周期事件(如页的 Load 事件)中调用 AddValidationCallback 方法,将您在步骤 1 中定义的事件处理程序作为第一个参数传递。
下面的代码示例将 ValidateCacheOutput 方法设置为验证处理程序。
protected void Page_Load(object sender, EventArgs e) { Response.Cache.AddValidationCallback( new HttpCacheValidateHandler(ValidateCacheOutput), null); }
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