Преобразование Web.config, поиск и замена
Мне нужно переключить IP-адрес в нескольких службах WCF в web.config. С преобразованием web.config, есть ли способ, кроме указания каждого адреса каждый через xpath, для создания оператора поиска и замены. Например, отключите IP-адрес 1.2.3.4 с 4.3.2.1 для всех случаев 1.2.3.4.
1 ответ
Скажем, ваш Web.config выглядит примерно так (упрощенный сценарий, но // в XPath работает везде):
<configuration>
<endpoint address="1.2.3.4" />
<endpoint address="1.2.3.4" />
<endpoint address="1.2.3.4" />
<endpoint address="1.2.3.4" />
</configuration>
тогда вам понадобится что-то вроде этого:
<?xml version="1.0"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<replaceAll>
<endpontAddresses xdt:Locator="XPath(//endpoint[@address='1.2.3.4'])" xdt:Transform="SetAttributes(address)" address="4.3.2.1" />
</replaceAll>
</configuration>
ПРИМЕЧАНИЕ: этот XPath будет искать каждый элемент во всем Web.config и проверьте, имеет ли данный элемент адресный атрибут со значением, равным "1.2.3.4". Если вам нужно что-то более общее, попробуйте это:
<?xml version="1.0"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<replaceAll>
<endpontAddresses xdt:Locator="XPath(//*[@address='1.2.3.4'])" xdt:Transform="SetAttributes(address)" address="4.3.2.1" />
</replaceAll>
</configuration>
Это будет смотреть на каждый элемент XML (из-за звездочки: *) и проверять, имеет ли он атрибут адреса со значением, равным "1.2.3.4". Так что это будет работать для такого файла:
<configuration>
<endpoint name="serviceA" address="1.2.3.4" />
<endpoint name="serviceB" address="1.2.3.4" />
<endpoint name="serviceC" address="1.2.3.4" />
<endpoint2 address="1.2.3.4" />
<endpoint3 address="1.2.3.4" />
<endpoint4 address="1.2.3.4" />
<innerSection>
<endpoint address="1.2.3.4" />
<anotherEndpoint address="1.2.3.4" />
<sampleXmlElement address="1.2.3.4" />
</innerSection>
</configuration>
Теперь, если вы хотите ограничить замены определенным разделом, т.е. <system.serviceModel>
тогда вы можете использовать XPath вот так:
<endpontAddresses xdt:Locator="XPath(/configuration/system.serviceModel//*[@address='1.2.3.4'])" xdt:Transform="SetAttributes(address)" address="4.3.2.1" />
Это обновит адреса только в <system.serviceModel>
раздел
<configuration>
<endpoint name="serviceA" address="1.2.3.4" />
<endpoint name="serviceB" address="1.2.3.4" />
<endpoint name="serviceC" address="1.2.3.4" />
<endpoint2 address="1.2.3.4" />
<endpoint3 address="1.2.3.4" />
<endpoint4 address="1.2.3.4" />
<innerSection>
<endpoint address="1.2.3.4" />
<anotherEndpoint address="1.2.3.4" />
<sampleXmlElement address="1.2.3.4" />
</innerSection>
<system.serviceModel>
<endpoint name="serviceB" address="1.2.3.4" />
<endpoint name="serviceC" address="1.2.3.4" />
<endpoint2 address="1.2.3.4" />
<innerSection>
<endpoint address="1.2.3.4" />
<anotherEndpoint address="1.2.3.4" />
<sampleXmlElement address="1.2.3.4" />
</innerSection>
</system.serviceModel>
</configuration>
Попробуйте и выберите тот, который больше всего соответствует вашим потребностям.
ПРИМЕЧАНИЕ. Это имеет ограничение, заключающееся в том, что вам нужно указывать, как называется атрибут, содержащий IP (1.2.3.4), но я думаю, что лучше быть явным, чем иметь магию. Если у вас много имен, просто повторите