在Asp.NET Core

时间:2017-03-29 19:59:34

标签: asp.net-core web.config-transform

我刚刚遇到了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没有转换 - 只是默认值。 我是否会错过配置或命令执行中的某些内容?

8 个答案:

答案 0 :(得分:7)

有一个记录良好的tool on github用于xdt转换。 它也不依赖于命令,dotnet publishdotnet msbuild都可以正常工作

答案 1 :(得分:3)

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

此外,从2.2.100-preview1开始可以使用XDT。

示例:https://github.com/vijayrkn/webconfigtransform/blob/master/README.md

答案 2 :(得分:1)

可能我不清楚问题。对于我的情况,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

答案 3 :(得分:1)

继用户1820686的答案之后:

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>

答案 4 :(得分:1)

SD版本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

答案 5 :(得分:0)

Visual Studio 2017(VS2017)中的IIS Web部署ASP.NET Core(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. 右键单击web.DEV_Server.config,添加DEV_Server.pubxml转换文件
  5. 已将关注添加到web.DEV_Server.config

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

  1. 修改DEV_Server.pubxml以修改以下设置值。

<LastUsedBuildConfiguration>DEV_Server</LastUsedBuildConfiguration>

  1. 验证连接和发布

Deploy仍会上传其他配置文件,不确定如何停止。

答案 6 :(得分:0)

这对我有用:

  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>

答案 7 :(得分:0)

这对我来说适用于上面的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>