当我在MVC3中创建一个OutputCacheAttribute的简单子类时,我遇到了一些问题。这是代码:
public class ExampleOutputCacheAttribute : OutputCacheAttribute
{
public ExampleOutputCacheAttribute()
{
// breakpoint here
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// breakpoint here
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// breakpoint here
base.OnActionExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
// breakpoint here
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
// breakpoint here
base.OnResultExecuted(filterContext);
}
}
第一次请求具有此属性的控制器操作时,将触发构造函数和所有重写的方法,但是如果我刷新页面,则不会触发任何方法或构造函数。就好像从OutputCacheAttribute外部读取缓存一样,但是查看OutputCacheAttribute的MVC源代码,我可以看到在OnActionExecuting中,有代码用于检查缓存页面并返回结果:
filterContext.Result = new ContentResult() { Content = cachedValue };
任何人都可以了解正在发生的事情吗?
答案 0 :(得分:0)
似乎OutputCache过滤器比最初出现的过程更复杂。对于页面缓存,它挂钩到标准的ASP.NET输出缓存机制,该机制使用IIS中的OutputCacheModule HttpModule。一旦过滤器被点击一次并将页面添加到缓存中,后续请求就不会以任何方式访问过滤器。 OutputCacheModule拦截这些请求,并在管道上方返回缓存的对象。
对于动作缓存,使用单独的机制。这使用静态MemoryCache,并且每次请求都会触发构造函数和所有重写的方法。