【问题标题】:Why is OutputCache a result filter and not an action filter in ASP.NET MVC?为什么在 ASP.NET MVC 中 OutputCache 是结果过滤器而不是操作过滤器?
【发布时间】:2014-05-29 21:32:39
【问题描述】:

OutputCache 属性通常作为 ASP.NET MVC 中的结果过滤器示例给出。 This MSDN page 是一个地方。因此,它包装了 ActionResult 对象的执行。但是那个对象不是在 action 方法结束时执行的吗?我很困惑它如何允许使用缓存的响应并阻止操作本身执行,如果它只在该方法的末尾包装 ActionResult 的执行。我知道缓存是有效的,所以我显然遗漏了一些明显的部分。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    OutputCacheAttribute 继承自 ActionFilterAttribute,后者又实现 IActionFilterIResultFilter。因此OutputCacheAttribute 既是动作过滤器又是结果过滤器。

    仔细想想,这完全有道理。缓存背后的逻辑是这样的:

    1. 执行时
      • 该项目是否在缓存中?
      • 如果是:从缓存中返回(完成)
      • 如果否,请继续
    2. 获取结果
    3. 退出时
      • 放入缓存
      • 返回结果

    所以第 1 部分由 IActionFilter 的实现处理,如果它没有立即返回结果,我们继续操作,IResultFilter 的实现处理将该结果添加到缓存中以供将来调用。

    由于 ASP.NET 是开源的,这可以在代码中得到确认。查看OutputCacheAttribute.cs on codeplex

    • 第 222 行是在 OnActionExecuting 期间检查 cahce 的位置(IActionFilter 的一部分)

    • 第 237 - 249 行,OnActionExecuting 方法设置了在OnResultExecuted 期间调用的回调(IResultFilter 的一部分)

    【讨论】:

    • 嗯,MVC 至少是开源的。但是,是的,我应该看看那里并确认我最初的直觉。所以它确实是两者兼而有之。令人困惑的是,这么多文章将其称为结果过滤器。
    • 实际上,我仔细查看了OutputCacheAttribute.cs,看起来OnResultExecuting 和OnResultExecuted 内部没有发生任何缓存。所有缓存和检索都发生在 OnActionExecuting 内部。似乎我们应该只称它为动作过滤器。
    • 正如我在回答中所说,OnActionExecuting 期间创建了一个回调函数。这就是缓存的作用。但是,直到OnResultExecuted 才会调用它。请参阅在OnResultExecuted 期间调用的CompleteChildAction。因此,如果您不调用OutputCacheAttributeIResultFilter 合约,则不会缓存任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多