在mvc3中子类化outputcache问题

时间:2011-09-21 14:12:43

标签: asp.net-mvc-3 outputcache

当我在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 };

任何人都可以了解正在发生的事情吗?

1 个答案:

答案 0 :(得分:0)

似乎OutputCache过滤器比最初出现的过程更复杂。对于页面缓存,它挂钩到标准的ASP.NET输出缓存机制,该机制使用IIS中的OutputCacheModule HttpModule。一旦过滤器被点击一次并将页面添加到缓存中,后续请求就不会以任何方式访问过滤器。 OutputCacheModule拦截这些请求,并在管道上方返回缓存的对象。

对于动作缓存,使用单独的机制。这使用静态MemoryCache,并且每次请求都会触发构造函数和所有重写的方法。