web-dev-qa-db-fra.com

Est-il possible d'effectuer une opération "Remplacer ou insérer" à l'aide de la transformation web.config?

J'utilise la transformation web.config comme décrit dans l'article ci-dessous afin de générer des configurations pour différents environnements.

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

Je peux effectuer une transformation "Remplacer" en faisant correspondre la clé, par exemple.

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />

Et je peux faire des "inserts", par exemple.

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />

Mais ce que je voudrais vraiment vraiment utile est une transformation ReplaceOrInsert, car je ne peux pas toujours compter sur le fichier de configuration original ayant/n'ayant pas une certaine clé.

Est-ce qu'il y a un moyen de faire ça?

166
Chris Haines

J'ai trouvé une solution de contournement pas cher. Ce n'est pas joli et cela ne fonctionnera pas très bien si vous avez beaucoup d'éléments qui doivent être "Remplacer ou Insérer".

Faites un "Supprimer" puis un "InsertAfter | InsertBefore".

Par exemple,

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
101
an phu

En conjonction avec xdt:Transform="Remove" utilisation xdt:Transform="InsertIfMissing" dans VS2012.

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
115
ADW334034

Utilisez la transformation InsertIfMissing pour vous assurer que le appSetting existe.
Ensuite, utilisez la transformation Replace pour définir sa valeur.

<appSettings>
  <add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

Vous pouvez également utiliser la transformation SetAttributes à la place de Replace. La différence est que SetAttributes ne touche pas les nœuds enfants.

<appSettings>  
  <add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>

Ces techniques sont bien meilleures que remove + insert car les nœuds existants ne sont pas déplacés vers le bas de leur nœud parent. Les nouveaux nœuds sont ajoutés à la fin. Les nœuds existants restent là où ils se trouvent dans le fichier source.

Cette réponse s'applique uniquement aux versions les plus récentes de Visual Studio (2012 ou plus récent).

72
Steven Liekens

Une meilleure méthode pour moi consistait à insérer l'élément uniquement s'il n'existait pas car je ne définis que certains attributs. Le retrait de l'élément éliminerait tous les autres attributs de l'élément principal s'ils existaient.

exemple: web.config (sans élément)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

web.config (avec élément)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceDebug httpsHelpPageEnabled="true" />
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

À l'aide du localisateur avec une expression XPath, j'ajoute le nœud s'il n'existe pas, puis définit mon attribut:

<serviceDebug xdt:Transform="Insert"
  xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />

les deux fichiers web.config résultants ont includeExceptionDetailInFaults = "true" et le second conserve l'attribut httpsHelpPageEnabled, contrairement à la méthode remove/insert.

7
Dan

Le ci-dessous crée une nouvelle clé si la même clé n'est pas présente. s'il est présent, il remplace simplement l'existant.

<add key="some key" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)"/> <add key="some key" value="some value" xdt:Transform="Replace" xdt:Locator="Match(key)" />

0