如何在 ASP.NET MVC 中以编程方式在应用程序启动时禁用 OutputCache
How to programmatically disable OutputCache on application start in ASP.NET MVC
如果 web.config 中的 system.web.compilation
设置为 debug="true"
,我希望禁用 OutputCache
功能。
我可以通过在 Global.asax 的 Application_Start()
:
中调用此方法成功访问此值
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
CompilationSection configSection = (CompilationSection)ConfigurationManager.GetSection("system.web/compilation");
if (configSection?.Debug == true)
{
filters.Add(new OutputCacheAttribute()
{
VaryByParam = "*",
Duration = 0,
NoStore = true
});
}
}
问题是,我的控制器中任何明确设置 OutputCache
的端点都不会使用已设置的全局过滤器。
[OutputCache(CacheProfile = "Month")]
[HttpGet]
public ViewResult contact()
{
return View();
}
这里是 "Month" 配置文件在我的 web.config 中定义的位置:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Month" duration="2592000" location="Any" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
当我处于调试模式时,我需要能够取消使用显式定义的 OutputCache 配置文件,例如 "Month"。我该怎么做?
您可以为仅调试配置创建特殊的 web.config
文件,您可以在其中声明配置文件,如下所示:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Month" duration="0" location="Any" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
当您的应用程序在调试配置中构建时,您将没有缓存。
现在你只需要根据article
进行转换即可
@Back 的回答可能是最直接的解决方案,适用于希望在调试时禁用所有缓存的标准用例。但是,因为它不是编程解决方案,所以我想出了一种在代码中完成所有操作的方法,这也适用于更高级的用例。
首先,我们要捕获应用启动时是否处于调试模式。我们会将其存储在一个全局变量中以保持速度。
public static class GlobalVariables
{
public static bool IsDebuggingEnabled = false;
}
然后在Global.asax代码的Application_Start
方法中,写入全局属性.
protected void Application_Start()
{
SetGlobalVariables();
}
private void SetGlobalVariables()
{
CompilationSection configSection = (CompilationSection)ConfigurationManager
.GetSection("system.web/compilation");
if (configSection?.Debug == true)
{
GlobalVariables.IsDebuggingEnabled = true;
}
}
现在我们将创建自己的 class 用于缓存,它将继承自 OutputCacheAttribute
。
public class DynamicOutputCacheAttribute : OutputCacheAttribute
{
public DynamicOutputCacheAttribute()
{
if (GlobalVariables.IsDebuggingEnabled)
{
this.VaryByParam = "*";
this.Duration = 0;
this.NoStore = true;
}
}
}
现在,当您为缓存修饰控制器端点时,只需使用您的新属性而不是 [OutputCache]
。
// you can use CacheProfiles or manually pass in the arguments, it doesn't matter.
// either way, no caching will take place if the app was launched with debugging
[DynamicOutputCache(CacheProfile = "Month")]
public ViewResult contact()
{
return View();
}
如果 web.config 中的 system.web.compilation
设置为 debug="true"
,我希望禁用 OutputCache
功能。
我可以通过在 Global.asax 的 Application_Start()
:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
CompilationSection configSection = (CompilationSection)ConfigurationManager.GetSection("system.web/compilation");
if (configSection?.Debug == true)
{
filters.Add(new OutputCacheAttribute()
{
VaryByParam = "*",
Duration = 0,
NoStore = true
});
}
}
问题是,我的控制器中任何明确设置 OutputCache
的端点都不会使用已设置的全局过滤器。
[OutputCache(CacheProfile = "Month")]
[HttpGet]
public ViewResult contact()
{
return View();
}
这里是 "Month" 配置文件在我的 web.config 中定义的位置:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Month" duration="2592000" location="Any" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
当我处于调试模式时,我需要能够取消使用显式定义的 OutputCache 配置文件,例如 "Month"。我该怎么做?
您可以为仅调试配置创建特殊的 web.config
文件,您可以在其中声明配置文件,如下所示:
<system.web>
<caching>
<outputCacheSettings>
<outputCacheProfiles>
<add name="Month" duration="0" location="Any" varyByParam="*" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
</system.web>
当您的应用程序在调试配置中构建时,您将没有缓存。
现在你只需要根据article
进行转换即可@Back 的回答可能是最直接的解决方案,适用于希望在调试时禁用所有缓存的标准用例。但是,因为它不是编程解决方案,所以我想出了一种在代码中完成所有操作的方法,这也适用于更高级的用例。
首先,我们要捕获应用启动时是否处于调试模式。我们会将其存储在一个全局变量中以保持速度。
public static class GlobalVariables
{
public static bool IsDebuggingEnabled = false;
}
然后在Global.asax代码的Application_Start
方法中,写入全局属性.
protected void Application_Start()
{
SetGlobalVariables();
}
private void SetGlobalVariables()
{
CompilationSection configSection = (CompilationSection)ConfigurationManager
.GetSection("system.web/compilation");
if (configSection?.Debug == true)
{
GlobalVariables.IsDebuggingEnabled = true;
}
}
现在我们将创建自己的 class 用于缓存,它将继承自 OutputCacheAttribute
。
public class DynamicOutputCacheAttribute : OutputCacheAttribute
{
public DynamicOutputCacheAttribute()
{
if (GlobalVariables.IsDebuggingEnabled)
{
this.VaryByParam = "*";
this.Duration = 0;
this.NoStore = true;
}
}
}
现在,当您为缓存修饰控制器端点时,只需使用您的新属性而不是 [OutputCache]
。
// you can use CacheProfiles or manually pass in the arguments, it doesn't matter.
// either way, no caching will take place if the app was launched with debugging
[DynamicOutputCache(CacheProfile = "Month")]
public ViewResult contact()
{
return View();
}