Azure 应用程序部署中的众多参数之一的参数化 Web.config 失败

Parameterizing Web.config fails for one of many parameters in Azure app deployment

我迷路了。我有一个带有配置文件和几个参数的 Web 项目,这些参数需要根据目标环境进行不同的设置。我有一个应用程序设置和一个连接字符串。 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 App Service Deploy 任务稍后在部署期间使用的参数规范。在这里,我指定了要替换的两个值。

parameters.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 保持不变。我什至没有设置默认值。它保持其最初在 Web.config.

中设置的值 DEFINE

我的直觉告诉我我的 XPath /configuration/connectionStrings/add[@name='DbConn']/@connectionString 是不正确的,但它对我来说没问题,并且遵循其他帖子所做的,例如 Cobus Bernard.

非常感谢任何帮助。

我研究了日志文件,发现 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 问题:How to Publish Web with msbuild?

1) 调整项目文件

卸载您的 Web 项目,编辑项目文件并在您想要的配置中添加以下行:

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

构建过程将选择它并停止处理特殊的连接字符串。

我觉得这个解决方案太隐蔽了,人们会忘记,所以替代方案更明确一点:

2) 配置 MSBuild

构建发布包时将显式参数传递给 MSBuild:

msbuild /P:Configuration=Release;AutoParameterizationWebConfigConnectionStrings=false;...