在 Asp.NET 核心中设置 web.config 转换

Set web.config transform in Asp.NET Core

我刚刚遇到 asp.net 核心中的 web.config 转换问题。

有两个文件:base web.config 和 web.prod-zone-a.config。我的目标是在发布我的项目时在 web.prod-zone-a.config 内使用转换。 我在 .csproj 中有以下 "prod-zone-a" 配置设置:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'prod-zone-a|AnyCPU' ">
    <IntermediateOutputPath>obj\Debug\netcoreapp1.1</IntermediateOutputPath>
    <DebugSymbols>true</DebugSymbols>
    <Optimize>false</Optimize>
    <DefineConstants>TRACE;DEBUG;NETCOREAPP1_1</DefineConstants>
    <Configuration>prod-zone-a</Configuration>
</PropertyGroup>

web.prod-zone-a.config 看起来像:

<system.webServer>
    <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore>
        <environmentVariables xdt:Transform="Replace">
            <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="prod-zone-a" />
        </environmentVariables>
    </aspNetCore>
</system.webServer>

我尝试通过两个命令运行发布:

dotnet msbuild /t:Publish /p:OutputPath=c:\delivery /p:Configuration=prod-zone-a

dotnet publish --configuration prod-zone-a --output c:\delivery

但没有任何转换适用于 web.config 输出 - 只是默认值。 我是否遗漏了配置或命令执行中的某些内容?

xdt 转换有详细的文档记录 tool on github。 它也不依赖于命令,dotnet publishdotnet msbuild 都可以正常工作

可能是我没问清楚。对于我的案例 web.config 覆盖 web.Release.config 文件中的所有设置。

为我修复,我只是为转换 xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" to configuration 文件添加参考。

所以,.config 文件应该开始:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

一段时间后,最好的解决方案是使用 dotnet-transform-xdt tool

继上面 user1820686 的回答之后:

github 页面遗漏了为 MSBuild/csproj 工具添加此内容所需的一些步骤:

您需要在您的项目目录中打开命令提示符并且运行

dotnet add myProj.csproj package Microsoft.DotNet.Xdt.Tools --version 2.0.0

然后需要打开csproj文件,添加

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.Dotnet.Xdt.Tools" Version="2.0.0" />
    <!-- ... other package references ... -->
</ItemGroup>

使用最新版本的 dotnet cli(2.1.400 或更高版本),您只需设置此 msbuild 属性 $(EnvironmentName) 并且发布工具将负责添加 ASPNETCORE_ENVIRONMENT environmentVariable 到具有指定环境名称的 web.config。

此外,XDT 支持从 2.2.100-preview1 开始可用。

样本:https://github.com/vijayrkn/webconfigtransform/blob/master/README.md

IIS Web 部署 ASP.NET Visual Studio 2017 (VS2017) 中的核心 (2.1)

首先这样做:(ref:https://github.com/nil4/dotnet-transform-xdt#-use-with-msbuildcsproj-tooling)

  1. 安装包 - dotnet add package DotNet.Xdt --version 2.1.0
  2. 修改.csproj - 添加包 - 参考github
  3. 修改.csproj - 在末尾添加转换代码(ApplyXdtConfigTransform) - 参考github
  4. 通过右键单击 DEV_Server.pubxml
  5. 添加 web.DEV_Server.config 转换文件
  6. web.DEV_Server.config
  7. 中添加了以下内容

<environmentVariable xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="Development" xdt:Transform="SetAttributes" />

  1. 修改DEV_Server.pubxml修改如下设置值

<LastUsedBuildConfiguration>DEV_Server</LastUsedBuildConfiguration>

  1. 验证连接并发布

部署仍在上传其他配置文件,不知道如何停止。

这对我有用:

  1. web.release.config 文件添加到项目根目录。
  2. 在 Visual Studio 2017 年,使用 Web Deploy 发布(确保它设置为 Release)。设置将被自动拾取。

示例转换:

    <?xml version="1.0"?>
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
        <system.webServer>
          <aspNetCore>
            <environmentVariables>
              <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="PRODUCTION" xdt:Locator="Match(name)" xdt:Transform="SetAttributes" />
            </environmentVariables>
          </aspNetCore>
        </system.webServer>
    </configuration>

更新:如果您想在发布时删除 web.config.release 文件和其他文件,只需编辑您的 .csproj 文件并添加如下内容:

  <ItemGroup>
    <Content Remove="appsettings.Development.json" />
    <Content Remove="web.release.config" />
  </ItemGroup>
  <ItemGroup>
    <None Include="appsettings.Development.json" />
    <None Include="web.release.config" />
  </ItemGroup>

SDK 2.2 版 dotnet publish 现在支持此功能,并提供了一大堆选项。

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/transform-webconfig?view=aspnetcore-2.2

我认为在问题的示例中,它会在发布为

时起作用

dotnet publish --configuration prod-zone-a

上面的 1. 和 2. 这对我有用:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>
      <httpErrors existingResponse="PassThrough"
                  xdt:Locator="Match(existingResponse)"
                  xdt:Transform="InsertIfMissing" />
    </system.webServer>
  </location>
</configuration>