我在我的项目中使用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...
}
有没有正确的方法呢?
答案 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's。 https://stackoverflow.com/a/9694955/1911240