asp.net - Gibt es eine Möglichkeit, eine "Ersetzen oder Einfügen" mit Web.config-Transformation zu tun?



web-config-transform xslt (4)

Das folgende erstellt einen neuen Schlüssel, wenn derselbe Schlüssel nicht vorhanden ist. Wenn vorhanden, ersetzt es einfach das bestehende.

<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)" />

Ich verwende die web.config-Umwandlung wie im folgenden Beitrag beschrieben, um Konfigurationen für verschiedene Umgebungen zu generieren.

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

Ich kann eine "Ersetzen" -Transformation durchführen, indem ich auf den Schlüssel absuche, z

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

Und ich kann "Inserts" zB machen

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

Aber was ich wirklich nützlich finde, ist eine ReplaceOrInsert-Umwandlung, da ich nicht immer darauf vertrauen kann, dass die ursprüngliche Konfigurationsdatei einen bestimmten Schlüssel hat oder nicht.

Gibt es eine Möglichkeit, dies zu tun?


Eine bessere Methode für mich war, das Element nur einzufügen, wenn es nicht existiert, da ich nur bestimmte Attribute setze. Durch das Entfernen des Elements werden alle anderen Attribute des Hauptelements verworfen, sofern sie vorhanden sind.

Beispiel: web.config (ohne Element)

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

web.config (mit Element)

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

Wenn ich den Locator mit einem XPath-Ausdruck verwende, füge ich den Knoten hinzu, wenn dieser nicht existiert, und setze dann mein Attribut:

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

Die beiden resultierenden web.config-Dateien haben includeExceptionDetailInFaults = "true" und die zweite behält das httpsHelpPageEnabled-Attribut bei, das die Methode "remove / insert" nicht enthält.


In Verbindung mit xdt:Transform="Remove" verwende in xdt:Transform="InsertIfMissing" .

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

Verwenden Sie die InsertIfMissing Umwandlung, um sicherzustellen, dass die AppSetting vorhanden ist.
Verwenden Sie dann die Replace Umwandlung, um ihren Wert Replace .

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

Sie können auch die SetAttributes Umwandlung anstelle von Replace . Der Unterschied besteht darin, dass SetAttributes die SetAttributes Knoten nicht berührt.

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

Diese Techniken sind viel besser als remove + insert, da vorhandene Knoten nicht an den unteren Rand des übergeordneten Knotens verschoben werden. Neue Knoten werden am Ende angehängt. Vorhandene Knoten bleiben dort, wo sie sich in der Quelldatei befinden.

Diese Antwort gilt nur für neuere Versionen von Visual Studio (2012 oder neuer).





xdt-transform