1

我有一个 ASP.NET Web API 项目,其中包括 2 个配置转换:

  • Web.Live.config
  • Web.UAT.config

如果我在发布时选择其中一个LiveUAT配置,则转换不会应用于呈现的web.config文件。

我检查了我的转换配置,并且namexdt:Transformxdt:Locator正确的。

在我的web.config我有:

<connectionStrings>
    <add name="foo" providerName="System.Data.SqlClient" connectionString="[main connection string]" />
</connectionStrings>

在我的web.Live.config我有:

<?xml version="1.0" encoding="utf-8"?>

<!-- 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">

  <connectionStrings>
    <add name="foo" 
      connectionString="[live connection string]" 
      xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.

      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

但是,即使Live选择了,我发布的连接字符串仍然显示如下:

<connectionStrings>
    <add name="foo" providerName="System.Data.SqlClient" connectionString="[main connection string]" />
</connectionStrings>

发生这种情况的可能原因有哪些?

4

2 回答 2

1

在这种情况下,问题似乎是假设更改构建配置文件将自动更新您的发布配置文件以匹配 - 事实并非如此。

如果您有一个发布配置文件,那么您必须在每次构建时手动更改“设置”>“发布”>“配置”设置,因为这是确定应用哪个配置转换文件的原因。

处理此问题的推荐方法是创建多个发布配置文件 - 每个构建配置一个。例如,“Debug”和“Release”,或者在本例中为“Live”和“UAT”。这样,您可以在发布过程中轻松地在两个配置文件之间切换。

值得注意的是,这种方法除了管理转换之外还有其他好处。为不同的构建提供不同的配置文件也允许您指定不同的目标。例如,如果您使用 Web Deploy 方法,您可以根据您的目标环境(例如测试或生产)将应用程序发送到不同的服务器

于 2013-10-09T09:38:55.247 回答
1

我有一个类似的问题,其中应用的转换将来自“调试”,而不是来自我的“测试”配置。我通过手动编辑一些文件来解决它。我不确定哪些是错的,以及它们是如何出错的,但这就是我解决它的方法。

我从“调试”更改了 .sln:

    {96...D2A}.Test|Any CPU.ActiveCfg = Debug|Any CPU
    {96...D2A}.Test|Any CPU.Build.0 = Debug|Any CPU
    {96...D2A}.Test|Mixed Platforms.ActiveCfg = Debug|Any CPU
    {96...D2A}.Test|Mixed Platforms.Build.0 = Debug|Any CPU
    {96...D2A}.Test|x86.ActiveCfg = Debug|Any CPU

去测试”:

    {96...D2A}.Test|Any CPU.ActiveCfg = Test|Any CPU
    {96...D2A}.Test|Any CPU.Build.0 = Test|Any CPU
    {96...D2A}.Test|Mixed Platforms.ActiveCfg = Test|Any CPU
    {96...D2A}.Test|Mixed Platforms.Build.0 = Test|Any CPU
    {96...D2A}.Test|x86.ActiveCfg = Test|Any CPU

我将 .csproj 中的测试配置从:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Test|AnyCPU'">
  <DebugSymbols>true</DebugSymbols>
  <OutputPath>bin\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <DebugType>full</DebugType>
  <PlatformTarget>AnyCPU</PlatformTarget>
  <ErrorReport>prompt</ErrorReport>
  <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

到(我不确定所有这些删除的参数是什么意思/暗示):

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Test|AnyCPU'">
  <OutputPath>bin\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>

我将 .csproj 中的 Web.Test.config 更改为:

<None Include="Web.Test.config">
  <DependentUpon>Web.config</DependentUpon>
</None>

至:

<Content Include="Web.Test.config">
  <DependentUpon>Web.config</DependentUpon>
</Content>
于 2014-08-15T21:59:58.900 回答