我正在阅读如何以编程方式使 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()
方法。而且由于此方法是静态
,因此不必调用页面生命周期。
我希望对此有更多了解的人可以发表评论,但在我看来,这也意味着以下内容:
- 在给定的示例中,
HttpCacheValidateHandler
不需要是页面的静态方法,因为它不使用Page
对象的任何属性。它可以是您喜欢的任何其他对象上的静态方法。 - 可能会为每个页面请求调用
ValidateCacheOutput()
方法,而不仅仅是(ab)用于调用Response.Cache.AddValidationCallback()
的页面>。也许我错过了一些明显的东西,但我不明白缓存如何“知道”哪个HttpCacheValidateHandler
属于哪个页面。
关于ASP.NET 缓存 - 以编程方式使服务器缓存无效...示例中的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801883/