2017-10-10 269 views
0

如果web.config中的system.web.compilation設置設置爲debug="true",我希望OutputCache功能被禁用。如何以編程方式禁用ASP.NET MVC中的應用程序的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(); 
} 

這裏就是那「月」的個人資料在我的web.config中定義:

<system.web> 
    <caching> 
    <outputCacheSettings> 
     <outputCacheProfiles> 
     <add name="Month" duration="2592000" location="Any" varyByParam="*" /> 
     </outputCacheProfiles> 
    </outputCacheSettings> 
    </caching> 
</system.web> 

我需要能夠抵消使用的明確定義的OutputCache配置文件,如「月」,當我在調試模式。我怎樣才能做到這一點?

<system.web> 
    <caching> 
    <outputCacheSettings> 
     <outputCacheProfiles> 
     <add name="Month" duration="0" location="Any" varyByParam="*" /> 
     </outputCacheProfiles> 
    </outputCacheSettings> 
    </caching> 
</system.web> 

當你的應用程序是內置的調試配置你不會有任何緩存:

回答

0

實施改造@返回的答案可能是最直接的解決方案,爲想要的標準使用情況下工作調試時禁用所有緩存。但是,因爲它不是一個程序化的解決方案,所以我想出了一種在代碼中完成所有工作的方法,這也適用於更高級的用例。

首先,我們要捕獲應用程序啓動時是否處於調試模式。我們將它存儲在一個全局變量中以保持速度。

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; 
    } 
} 

我們將創建自己的類用於緩存,將從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(); 
} 
1

您可以調試,只能配置,在那裏你可以申報的個人資料這樣產生特殊的web.config文件。

Transform config

Different configurations

現在你只需要根據article

相關問題