如何在 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();
}