Есть ли способ сделать «Заменить или вставить» с помощью преобразования web.config? - PullRequest
164 голосов
/ 20 апреля 2011

Я использую преобразование web.config, как описано в посте ниже, для генерации конфигов для различных сред.

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

Я могу выполнить преобразование «Заменить» с помощьюсопоставление по ключу, например,

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

И я могу сделать "Вставки", например

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

Но то, что я бы действительно нашел полезным, это преобразование ReplaceOrInsertпоскольку я не всегда могу полагаться на исходный файл конфигурации, имеющий / не имеющий определенный ключ.

Есть ли способ сделать это?

Ответы [ 5 ]

115 голосов
/ 22 мая 2013

В сочетании с xdt:Transform="Remove" используйте xdt:Transform="InsertIfMissing" в VS2012.

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
101 голосов
/ 12 мая 2011

Я нашел дешевый обходной путь. Это не красиво и не будет работать очень хорошо, если у вас есть много элементов, которые должны быть «Заменить или вставить».

Сделайте «Удалить», а затем «InsertAfter | InsertBefore».

Например,

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>
70 голосов
/ 10 июля 2015

Используйте преобразование InsertIfMissing, чтобы убедиться, что appSetting существует.
Затем используйте преобразование 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>

Вы также можете использовать преобразование SetAttributes вместо Replace. Разница в том, что SetAttributes не касается дочерних узлов.

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

Эти методы намного лучше, чем удаление + вставка, поскольку существующие узлы не перемещаются в конец своего родительского узла. Новые узлы добавляются в конце. Существующие узлы остаются там, где они находятся в исходном файле.

Этот ответ относится только к более новым версиям Visual Studio (2012 или более поздней версии).

7 голосов
/ 19 июля 2011

Лучшим способом для меня было вставить элемент, только если он не существует, так как я устанавливаю только определенные атрибуты.Удаление элемента приведет к удалению любых других атрибутов основного элемента, если они существуют.

пример: web.config (без элемента)

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

web.config (с элементом)

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

Используя локатор с выражением XPath, я добавляю узел, если он не существует, и затем устанавливаю свой атрибут:

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

оба полученных файла web.config имеют includeExceptionDetailInFaults = "true"и второй сохраняет атрибут httpsHelpPageEnabled, где метод удаления / вставки не будет.

0 голосов
/ 12 сентября 2017

Ниже создается новый ключ, такого же ключа нет.если он присутствует, он просто заменяет существующий.

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

...