Есть ли способ сделать "заменить или вставить" с помощью web.преобразование конфигурации?


Я использую веб.преобразование конфигурации, как описано в приведенном ниже сообщении, для создания конфигураций для разных сред.

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 148

5 ответов:

Я нашел дешевое решение. Это не очень красиво и не будет работать очень хорошо, если у вас есть много элементов, которые должны быть "заменить или вставить".

сделать "удалить", а затем "InsertAfter|InsertBefore".

например,

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

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

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

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

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

пример: сеть.конфиг (без элемента)

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

web.конфигурации (с элементом)

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

как в результате этого интернет.конфигурационные файлы имеют includeExceptionDetailInFaults= "true", а второй сохраняет атрибут httpsHelpPageEnabled, где метод remove/insert не будет.

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

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