Преобразование Web.config, поиск и замена - PullRequest
5 голосов
/ 20 января 2012

Мне нужно отключить IP-адрес в нескольких службах WCF в web.config. С преобразованием web.config, есть ли способ, кроме указания каждого адреса каждый через xpath, создать оператор поиска и замены. Например. отключить IP-адрес 1.2.3.4 с 4.3.2.1 для всех случаев 1.2.3.4

1 Ответ

4 голосов
/ 02 апреля 2012

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

...