MVC5 - 特定Action的Block Controller OutputCache

时间:2017-07-27 12:43:06

标签: asp.net-mvc c#-4.0 asp.net-mvc-5

我有一个控制器,班级有

[OutputCache(NoStore = true, Duration = 0)]

控制器有一个子操作。这与OutputCache无关。有没有办法告诉这个动作不要使用类值?

替代方案似乎是在所有非子操作上设置属性,或者为子操作创建单独的控制器。

我很高兴在子操作上保留相同的缓存设置,除了子操作不支持NoStore,因此您收到错误。 [OutputCache(Duration=0)]也无效。

为了解决没有缓存是默认值的问题,那么为什么要首先设置它呢?这会将客户端从Cache-Control: private收到的标头更改为

Cache-Control: private, no-store, max-age=0
Pragma: no-cache

即。符合要求的用户代理不会在本地缓存它。请注意,这适用于某人可能会丢失其访问设备的Intranet站点,而不是Internet站点。

2 个答案:

答案 0 :(得分:2)

OutputCache是一个可继承的属性。这意味着您可以在控制器上设置时覆盖它的行为,只需添加一个不同的操作即可。例如:

[OutputCache(Duration = 3600)]
public class MyController : Controller
{
    [OutputCache(Duration = 60)]
    public ActionResult Foo()
    {
        return View();
    }

    public ActionResult Bar()
    {
        return View();
    }
}

Bar操作将根据控制器级别设置缓存1小时,而Foo将缓存1分钟。

那就是说,我不确定你在这里做了什么。有效地使用NoStore = true, Duration = 0 禁用缓存,因此您不需要在此时对子操作执行任何操作以使其不被缓存,因为控制器已经指定内部没有任何内容真的会被缓存。从逻辑上讲,您希望将OutputCache添加到您 想要缓存的控制器中的操作,但此时,在控制器级别禁用缓存是没有意义的:'无论如何都是有效的默认值。

答案 1 :(得分:0)

我也有类似情况。就我而言,我正在尝试将OutputCache属性注册为全局过滤器,并且当View包含子操作时,它给了我同样的错误。我最终要做的是创建一个继承OutputCacheAttribute的自定义属性。并跳过所有用ChildActionOnly属性修饰的动作。假设您所有的孩子动作都装饰有这样的装饰。

public class NoCacheAttribute : OutputCacheAttribute
{
    public NoCacheAttribute()
    {
        base.NoStore = true;
        base.Duration = 0;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionDescriptor.GetCustomAttributes(typeof(ChildActionOnlyAttribute), false).Any()) return;

        base.OnActionExecuting(filterContext);
    }
}

更新: 更好的是,使用filterContext.IsChildAction来检测孩子

public class NoCacheAttribute : OutputCacheAttribute
{
    public NoCacheAttribute()
    {
        base.NoStore = true;
        base.Duration = 0;
    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.IsChildAction) return;

        base.OnActionExecuting(filterContext);
    }
}