Set web.config transform in Asp.NET Core

强颜欢笑 提交于 2019-12-10 04:17:08

问题


I've just came across with problem of web.config transformation in asp.net core.

There are two files: base web.config and web.prod-zone-a.config. My aim is to use transformation inside web.prod-zone-a.config when publishing my project. I have the following "prod-zone-a" configuration settings in .csproj:

  <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 looks like:

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

I tried to run publish by two commands:

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

and

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

But no transformation applies to web.config on output - just the default value. Do I miss something in configuration or command executing?


回答1:


There is a well-documented tool on github for xdt-transformations. Also it doesn't depend on command, both of dotnet publish and dotnet msbuild works fine




回答2:


With the latest version of dotnet cli (2.1.400 or greater), you can just set this msbuild property $(EnvironmentName) and publish tooling will take care of adding ASPNETCORE_ENVIRONMENT environmentVariable to the web.config with the specified environment name.

Also, XDT support is available starting 2.2.100-preview1.

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




回答3:


This worked for me:

  1. Add web.release.config file to the project root.
  2. In Visual Studio 2017, Publish using Web Deploy (make sure it is set to Release). Settings will automatically be picked up.

Sample transformation:

<?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>



回答4:


Following on from user1820686's answer above:

The github page misses out some of the steps required to add this for MSBuild/csproj tooling:

You need to open a command prompt in your project directory and run dotnet add myProj.csproj package Microsoft.DotNet.Xdt.Tools --version 2.0.0

Then you need to open the csproj file and add

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




回答5:


may be i don't clear question. For mine case web.config override all settings in web.Release.config file.

Fix for me, i just add reference for transformation xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" to configuration file.

so, .config file should start:

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

After some time, the best solutions is using dotnet-transform-xdt tool




回答6:


This is now supported by dotnet publish from SDK version 2.2 with a whole bunch of options.

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

I think in the example from the question, it would then work when published as

dotnet publish --configuration prod-zone-a




回答7:


This worked for me with the 1. & 2. above:

<?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>



回答8:


IIS Web Deploy ASP.NET Core (2.1) in Visual Studio 2017 (VS2017)

First do this: (ref:https://github.com/nil4/dotnet-transform-xdt#-use-with-msbuildcsproj-tooling)

  1. Install package - dotnet add package DotNet.Xdt --version 2.1.0
  2. Modify .csproj - add package - refer github
  3. Modify .csproj - add transform code (ApplyXdtConfigTransform) at the end - refer github
  4. Add web.DEV_Server.config transfor file by right-clicking on DEV_Server.pubxml
  5. Added following to web.DEV_Server.config

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

  1. Modify DEV_Server.pubxml to modify following setting value.

<LastUsedBuildConfiguration>DEV_Server</LastUsedBuildConfiguration>

  1. Validate Connection & Publish

Deploy still uploads other config files, not sure how to stop that.



来源:https://stackoverflow.com/questions/43103044/set-web-config-transform-in-asp-net-core

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!