ASP.NET 缓存 - 以编程方式使服务器缓存无效...示例中的困惑

标签 asp.net caching httphandler

我正在阅读如何以编程方式使 ASP.NET 中服务器上的缓存页面失效,这本书(“MCTS 自定进度培训套件(考试 70-515)”)说:

To directly control whether a cached version of a page is used or whether the page is dynamically generated, response to the ValidateCacheOutput event and set a valid value for the HttpValidationStatus attribute.

代码段如下所示:

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;
}

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

有人可以向我解释一下这段代码的作用吗?另外,我的主要问题是,我认为缓存页面只是从服务器返回,但下面的代码表明正在调用页面生命周期(Page_Load 事件);我很困惑,因为如果返回缓存页面,则不会调用页面生命周期,那么 Page_Load 事件中的代码将如何触发?

注意:这是same example这本书有

最佳答案

我也遇到过这个问题。不幸的是,我发现的关于这个主题的几乎所有博客文章和文章都忠实地复制了 MSDN example没有真正解释它是如何工作的。

我没有明确的答案,但我认为这是可行的,因为页面生命周期至少被调用一次。即当第一次请求该页面时,该页面尚未被缓存。 在第一个请求期间,调用 Page_Load 并向 Cache 对象注册 HttpCacheValidateHandler。在对该页面的所有后续请求期间,Cache 对象能够调用您的 ValidateCacheOutput() 方法。而且由于此方法是静态,因此不必调用页面生命周期。

我希望对此有更多了解的人可以发表评论,但在我看来,这也意味着以下内容:

  1. 在给定的示例中,HttpCacheValidateHandler 不需要是页面的静态方法,因为它不使用 Page 对象的任何属性。它可以是您喜欢的任何其他对象上的静态方法。
  2. 可能会为每个页面请求调用 ValidateCacheOutput() 方法,而不仅仅是(ab)用于调用 Response.Cache.AddValidationCallback() 的页面>。也许我错过了一些明显的东西,但我不明白缓存如何“知道”哪个 HttpCacheValidateHandler 属于哪个页面。

关于ASP.NET 缓存 - 以编程方式使服务器缓存无效...示例中的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801883/

相关文章:

caching - Couchbase 测试运行失败

c# - HttpHandler 和 XML 文件

httphandler - AjaxToolkit IIS7 Asp.Net 4.0 : Sys is not defined; handler mapping issue?

c# - 将 Plupload 与 ASP.NET/C# 结合使用

caching - 堆叠缓存引擎

asp.net - 更改货币文本中美分样式的简便方法

asp.net - 保护 ASP .Net Web API 以便与移动应用程序一起使用

c# - 列出所有 session 信息

asp.net - 什么会导致 ASP.NET 工作进程被回收?

ruby-on-rails - 页面缓存,自动过期/清理器的最佳实践