Преобразование 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), но я думаю, что лучше быть явным, чем иметь магию. Если у вас много имен, просто повторите

Другие вопросы по тегам