So ändern Sie den Wert des Attributs im Abschnitt appSettings mit der Web.config-Umwandlung

260

Ist es möglich, die folgende Datei web.config appSettings zu transformieren:

<appSettings>
    <add key="developmentModeUserId" value="00297022" />
    <add key="developmentMode" value="true" />
    /* other settings here that should stay */
</appSettings>

in so etwas:

<appSettings>
    <add key="developmentMode" value="false" />
    /* other settings here that should stay */
</appSettings>

Daher muss ich den Schlüssel developmentModeUserId entfernen und den Wert für den Schlüssel developmentMode ersetzen .

Libelle
quelle

Antworten:

452

Du willst so etwas wie:

<appSettings>
  <add key="developmentModeUserId" xdt:Transform="Remove" xdt:Locator="Match(key)"/>
  <add key="developmentMode" value="false" xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"/>
</appSettings>

Siehe auch: Web.config-Transformationssyntax für die Bereitstellung von Webanwendungsprojekten

Joe
quelle
24
Beachten Sie, dass bei den Tasten zwischen Groß- und Kleinschreibung unterschieden wird!
Cosmin
2
Hervorragende Antwort. Ich habe Optionen von Drittanbietern wie Slow Cheetah ausprobiert und bin nicht weitergekommen - das war einfach und perfekt.
Steve
2
@stevens: Sie benötigen Slow Cheetah, wenn Sie beispielsweise app.config-Dateien für native Anwendungen transformieren möchten. Die Syntax sollte jedoch identisch sein, wenn ich mich recht erinnere (es ist eine Weile her, seit ich Slow Cheetah verwenden musste).
Ellesedil
Eine Alternative zum langsamen Betrüger besteht darin, myotherconfig.staging.config zu erstellen und in der web.Staging.config-Transformation den Verweis auf myotherconfig.config in der web.config
nologo
3
Nur eine kleine Klarstellung, die einigen Leuten helfen könnte: Das xdt:Transform="SetAttributes" xdt:Locator="Match(key)"Teil sollte in der Datei Web.Whatever.config und nicht in der Datei Web.config verwendet werden.
user3533716
11

Alle AppSettings ersetzen

Dies ist der Overkill-Fall, in dem Sie nur einen ganzen Abschnitt der web.config ersetzen möchten. In diesem Fall werde ich alle AppSettings in der web.config durch neue Einstellungen in der web.release.config ersetzen. Dies ist meine Basis web.config appSettings:

<appSettings>
  <add key="KeyA" value="ValA"/>
  <add key="KeyB" value="ValB"/>
</appSettings>

Jetzt werde ich in meiner Datei web.release.config einen Abschnitt appSettings erstellen, außer dass ich das Attribut xdt: Transform = ”Replace” einbinde, da ich nur das gesamte Element ersetzen möchte. Ich musste xdt: Locator nicht verwenden, da nichts zu finden ist. Ich möchte nur den Schiefer sauber wischen und alles ersetzen.

<appSettings xdt:Transform="Replace">
  <add key="ProdKeyA" value="ProdValA"/>
  <add key="ProdKeyB" value="ProdValB"/>
  <add key="ProdKeyC" value="ProdValC"/>
</appSettings>

Beachten Sie, dass in der Datei web.release.config mein Abschnitt appSettings drei statt zwei Schlüssel enthält und die Schlüssel nicht einmal gleich sind. Schauen wir uns nun die generierte Datei web.config an, was passiert, wenn wir veröffentlichen:

<appSettings>
   <add key="ProdKeyA" value="ProdValA"/>
   <add key="ProdKeyB" value="ProdValB"/>
   <add key="ProdKeyC" value="ProdValC"/>
 </appSettings>

Wie erwartet wurden die app.ettings von web.config vollständig durch die Werte in der Konfiguration von web.release ersetzt. Das war einfach!

Joe
quelle
9

Wenn Sie Ihre App-Einstellung von einer Webkonfigurationsdatei in eine web.Release.config umwandeln möchten, müssen Sie die folgenden Schritte ausführen. Lassen Sie Ihre web.config App-Einstellungsdatei dies-

<appSettings>
     <add key ="K1" value="Debendra Dash"/>
  </appSettings>

Hier ist nun die web.Release.config für die Transformation.

<appSettings>
    <add key="K1" value="value dynamicly from Realease"
       xdt:Transform="SetAttributes"
          xdt:Locator="Match(key)"   
         />
  </appSettings>

Dadurch wird der Wert von K1 im Realese-Modus in den neuen Wert umgewandelt.

Debendra Dash
quelle
1

Ich mag es nicht, wenn Transformationen mehr Informationen als nötig haben. Anstatt die Schlüssel neu zu formulieren, gebe ich einfach den Zustand und die Absicht an . Es ist viel einfacher, die Absicht zu erkennen, wenn man es so macht, zumindest IMO. Außerdem versuche ich, alle xdtAttribute an die erste Stelle zu setzen, um dem Leser anzuzeigen, dass dies Transformationen sind und keine neuen Dinge definiert werden.

<appSettings>
  <add xdt:Locator="Condition(@key='developmentModeUserId')" xdt:Transform="Remove" />
  <add xdt:Locator="Condition(@key='developmentMode')" xdt:Transform="SetAttributes"
       value="false"/>
</appSettings>

Oben ist es viel einfacher zu erkennen, dass der erste das Element entfernt. Der zweite ist das Setzen von Attributen. Alle hier definierten Attribute werden gesetzt / ersetzt. In diesem Fall wird es einfach eingestellt valuezu false.

Codierung von Yoshi
quelle