2017-10-10 10 views
0

Je souhaite que la fonctionnalité OutputCache soit désactivée si le paramètre system.web.compilation dans le fichier web.config est défini sur debug="true".Comment faire pour désactiver par programme OutputCache au démarrage de l'application dans ASP.NET MVC

Je peux accéder avec succès cette valeur en appelant cette méthode dans mon Global.asax de 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 
     }); 
    } 
} 

Le problème est, tous les points de terminaison dans mes contrôleurs qui ont OutputCache mis explicitement ne pas utiliser le filtre global qui a été installer.

[OutputCache(CacheProfile = "Month")] 
[HttpGet] 
public ViewResult contact() 
{ 
    return View(); 
} 

Voici où ce « Mois » profil est défini dans mon web.config:

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

Je dois être en mesure d'annuler l'utilisation de profils OutputCache explicitement définis comme « Mois », quand je suis en mode de débogage. Comment puis-je faire ceci?

Répondre

0

@ réponse de Retour est probablement la solution la plus straight-forward qui fonctionnera pour le cas d'une utilisation standard de vouloir toute la mise en cache est désactivée pendant le débogage. Cependant, parce que ce n'est pas une solution programmatique, j'ai trouvé un moyen de tout faire en code, ce qui fonctionnera aussi pour des cas d'utilisation plus avancés. En premier lieu, nous voulons savoir si l'application est en mode de débogage lorsqu'elle est lancée. Nous allons stocker cela dans une variable globale pour garder les choses rapides.

public static class GlobalVariables 
{ 
    public static bool IsDebuggingEnabled = false; 
} 

Ensuite, dans la méthode Application_Start du code Global.asax, écrivez à la propriété globale.

protected void Application_Start() 
{ 
    SetGlobalVariables(); 
} 

private void SetGlobalVariables() 
{ 
    CompilationSection configSection = (CompilationSection)ConfigurationManager 
     .GetSection("system.web/compilation"); 
    if (configSection?.Debug == true) 
    { 
     GlobalVariables.IsDebuggingEnabled = true; 
    } 
} 

Maintenant, nous allons créer notre propre classe à utiliser pour la mise en cache, qui héritera de OutputCacheAttribute.

public class DynamicOutputCacheAttribute : OutputCacheAttribute 
{ 
    public DynamicOutputCacheAttribute() 
    { 
     if (GlobalVariables.IsDebuggingEnabled) 
     { 
      this.VaryByParam = "*"; 
      this.Duration = 0; 
      this.NoStore = true; 
     } 
    } 
} 

Maintenant, lorsque vous décorez vos points d'extrémité de contrôleur pour la mise en cache, il suffit d'utiliser votre nouvel attribut au lieu de [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

Vous pouvez créer un fichier spécial web.config pour la configuration de débogage uniquement, vous pouvez déclarer le profil comme celui-ci:

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

Et lorsque votre application est construite dans la configuration de débogage, vous aurez pas de cache.

Transform config

Different configurations

Maintenant, il vous suffit de mettre en œuvre la transformation selon la article