Mvc Donut Caching以编程方式禁用缓存

时间:2015-05-28 08:38:40

标签: c# asp.net-mvc caching donut-caching

我在我的项目中使用MvcDonutCaching并寻找一种方法来全局禁用缓存,以便在调试/测试期间提供帮助。

我找不到有关如何在文档中实现此目的的任何示例,但我发现CacheSettingsManager公开了IsCachingEnabledGlobally属性,但这是readonly

CacheSettingsManager没有任何构造函数允许我配置此设置。有没有办法配置这个设置?

有一种替代解决方案可能会起作用(丑陋),但它绝对是最后的手段,并不是真的有必要:

public class CustomOutputCache : DonutOutputCacheAttribute
{
    public CustomOutputCache()
    {
        if(ConfigurationManager.AppSettings["UseCache"] == "false")
        {
            base.NoStore = true;
            base.Duration = 0;
        }
    }
}

然后在我的控制器操作上使用它:

[CustomOutputCache]
public ActionResult Homepage() 
{
    // etc...
}

有没有正确的方法呢?

2 个答案:

答案 0 :(得分:0)

这是一个丑陋的解决方案,但您可以考虑使用编译标志。类似的东西:

#if !DEBUG
[DonutOutputCache]
#endif      
public ActionResult Homepage() 
{
   // etc...
}

仅在选择非调试配置时才会编译该属性。

答案 1 :(得分:0)

如果其他人偶然发现了这一点,请在FilterConfig.cs中添加以下内容

public class AuthenticatedOnServerCacheAttribute : DonutOutputCacheAttribute
{
    private OutputCacheLocation? originalLocation;

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {

        //NO CACHING this way
        if (ConfigurationManager.AppSettings["UseCache"] == "false")
        {
            originalLocation = originalLocation ?? Location;
            Location = OutputCacheLocation.None;
        }
        //Caching is on
        else
        {
            Location = originalLocation ?? Location;
        }

        base.OnResultExecuting(filterContext);
    }
}

您现在可以将其添加到控制器中。

    [AuthenticatedOnServerCache(CacheProfile = "Cache1Day")]
    public ActionResult Index()
    {
        return View();
    }

这个答案的灵感来自Felipe'shttps://stackoverflow.com/a/9694955/1911240