Есть ли способ сделать "заменить или вставить" с помощью 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 ответов:
Я нашел дешевое решение. Это не очень красиво и не будет работать очень хорошо, если у вас есть много элементов, которые должны быть "заменить или вставить".
сделать "удалить", а затем "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 не будет.