Параметризация Web.config завершается ошибкой для одного из многих параметров в развертывании приложения Azure.

Я потерян. У меня есть веб-проект, который поставляется с файлом конфигурации и несколькими параметрами, которые необходимо устанавливать по-разному для каждой целевой среды. У меня есть настройка приложения и строка подключения. Значения DEFINE необходимо заменить.

Web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <appSettings>
        <add key="HostUri" value="DEFINE"/>
        ...
    </appSettings>
    <connectionStrings>
        <add name="DbConn" connectionString="DEFINE" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    ...
</configuration>

У меня есть спецификация параметра, которую задача развертывания службы приложений Azure использует позже во время развертывания. Здесь я указал оба значения для замены.

параметры.xml:

<parameters>
    <parameter name="HostUri" defaultValue="Replace me!">
    <parameterEntry kind="XmlFile" scope="Web.config"
        match="/configuration/appSettings/add[@key='HostUri']/@value" />
</parameter>

<parameter name="DbConn" defaultValue="Replace me!">
    <parameterEntry kind="XmlFile" scope="Web.config"
        match="/configuration/connectionStrings/add[@name='DbConn']/@connectionString" />
  </parameter>
</parameters>

Хотя параметр приложения HostUri заменяется правильно, строка подключения DbConn остается нетронутой. Я даже не получаю значение по умолчанию. Он сохраняет свое значение DEFINE, изначально установленное в Web.config.

Моя интуиция подсказывает мне, что мой XPath /configuration/connectionStrings/add[@name='DbConn']/@connectionString неверен, но мне он кажется нормальным и соответствует тому, что сделали другие сообщения, такие как Кобус Бернар.

Любая помощь приветствуется.


person Quality Catalyst    schedule 11.01.2017    source источник


Ответы (1)


Я изучил файлы журналов и обнаружил, что MSBuild по-разному обрабатывает строки подключения:

...
Adding declared parameter 'HostUri'.
Adding declared parameter 'DbConn'.
Adding declared parameter 'DbConn-Web.config Connection String'.
...

Последняя строка привела к нежелательной записи в сгенерированном файле SetParameters.xml:

...
<setParameter name="HostUri" value="Replace me!" />
<setParameter name="DbConn" value="Replace me!" />
<setParameter name="DbConn-Web.config Connection String" value="DEFINE" />
...

Итак, мой XPath был правильным, но эта специальная директива поместила DEFINE в мой целевой Web.config. Я нашел два решения для этого, в основном на основе этого вопроса SO: Как опубликовать Интернет с помощью msbuild ?

1) Измените файл проекта

Выгрузите свой веб-проект, отредактируйте файл проекта и добавьте в желаемую конфигурацию следующую строку:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <!-- Add this line: --
    <AutoParameterizationWebConfigConnectionStrings>False</AutoParameterizationWebConfigConnectionStrings>
    ...
</PropertyGroup>

Процесс сборки уловит это и перестанет обрабатывать строки подключения особым образом.

Я нахожу это решение слишком скрытым, и люди забудут, поэтому альтернатива немного более явная:

2) Настройте MSBuild

Передайте явный аргумент в MSBuild при сборке пакета выпуска:

msbuild /P:Configuration=Release;AutoParameterizationWebConfigConnectionStrings=false;...
person Quality Catalyst    schedule 11.01.2017