Есть ли способ сделать "Заменить или вставить" с помощью преобразования web.config?
Я использую преобразование 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 ответов
Я нашел дешевый обходной путь. Это не красиво и не будет работать очень хорошо, если у вас есть много элементов, которые должны быть "Заменить или вставить".
Сделайте "Удалить", а затем "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
преобразование, чтобы убедиться, что 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 или более поздней версии).
Лучшим способом для меня было вставить элемент, только если он не существует, так как я устанавливаю только определенные атрибуты. Удаление элемента приведет к удалению любых других атрибутов основного элемента, если они существуют.
пример: 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, а метод удаления / вставки - нет.
Ниже создается новый ключ, такого же ключа нет. если он присутствует, он просто заменяет существующий.
<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)" />