1

我搞不清楚了。我有一个带有配置文件和几个参数的 Web 项目,这些参数需要根据目标环境进行不同的设置。我有一个应用程序设置和一个连接字符串。这些DEFINE值需要被替换。

网络配置:

<?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 任务稍后在部署期间使用的参数规范。在这里,我指定了要替换的两个值。

参数.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不正确,但我觉得它看起来不错,并且遵循其他帖子所做的事情,例如Cobus Bernard

任何帮助是极大的赞赏。

4

1 回答 1

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 是正确的,但是这个特殊指令将 aDEFINE放入了我的目标 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;...
于 2017-01-11T11:26:46.347 回答