3

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

我在文档中找不到任何关于如何实现这一点的示例,尽管我确实找到了CacheSettingsManagerwhich 暴露了一个IsCachingEnabledGlobally属性,但是 this 是readonly.

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

有一个替代解决方案可能有效(丑陋),但它绝对是最后的手段,不应该真的有必要:

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

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

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

有没有正确的方法来做到这一点?

4

2 回答 2

0

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

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

这将仅在选择非调试配置时编译属性。

于 2015-05-28T08:57:52.867 回答
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();
    }

这个答案的灵感来自菲利普在这里的回答。 https://stackoverflow.com/a/9694955/1911240

于 2017-08-08T17:13:34.513 回答