Asp.net mvc MVC5-用于特定操作的块控制器输出缓存
我有一个控制器,这个类有Asp.net mvc MVC5-用于特定操作的块控制器输出缓存,asp.net-mvc,c#-4.0,asp.net-mvc-5,Asp.net Mvc,C# 4.0,Asp.net Mvc 5,我有一个控制器,这个类有 [OutputCache(NoStore = true, Duration = 0)] 控制器有一个子动作。这与OutputCache没有任何关系。有没有办法告诉此操作不要使用类值 替代方案似乎是在所有非子操作上设置属性,或者为子操作创建单独的控制器 我很乐意在子操作上保持相同的缓存设置,只是子操作不支持NoStore,所以会出现错误[OutputCache(持续时间=0)]也无效 要解决无缓存是默认设置这一点,那么为什么要首先设置它呢?这会将客户端从缓存控制:pri
[OutputCache(NoStore = true, Duration = 0)]
控制器有一个子动作。这与OutputCache没有任何关系。有没有办法告诉此操作不要使用类值
替代方案似乎是在所有非子操作上设置属性,或者为子操作创建单独的控制器
我很乐意在子操作上保持相同的缓存设置,只是子操作不支持NoStore,所以会出现错误<代码>[OutputCache(持续时间=0)]也无效
要解决无缓存是默认设置这一点,那么为什么要首先设置它呢?这会将客户端从缓存控制:private
接收的头更改为
Cache-Control: private, no-store, max-age=0
Pragma: no-cache
即,一致性用户代理不会在本地缓存它。注意:这适用于可能丢失访问设备的intranet站点,而不是Internet站点。
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
添加到您确实希望缓存的控制器中的操作中,但此时,在控制器级别禁用缓存没有任何意义:无论如何,这实际上是默认设置。我也处于类似的情况。在我的例子中,我试图将OutputCache
属性注册为全局过滤器,当视图包含子操作时,它会给我相同的错误。我最后做的是创建一个自定义属性继承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);
}
}
我想你回答了你的问题,在孩子身上放置了一个属性或者移动了它。我很乐意在孩子的动作中保留缓存设置。问题是你得到了一个ChildActionOnly不支持NoStore的错误。我更新了问题以反映这一点。另外,如果你只设置了Duration=0,这也是无效的。我还添加了一些问题,比如我为什么要首先设置这个。它确实会更改客户端接收到的缓存头。