Установить преобразование web.config в Asp.NET Core

Я только что столкнулся с проблемой преобразования web.config в ядре asp.net.

Есть два файла: базовый web.config и web.prod-zone-a.config. Моя цель - использовать трансформацию внутри web.prod-zone-a.config при публикации моего проекта. У меня есть следующие параметры конфигурации "prod-zone-a" в.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 выглядит так:

<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 при выводе не применяется - только значение по умолчанию. Я что-то упускаю в конфигурации или выполнении команды?

5 ответов

Решение

На github есть хорошо документированный инструмент для xdt-преобразований. Также это не зависит от команды, как dotnet publish а также dotnet msbuild работает отлично

Это сработало для меня:

  1. добавлять web.release.config файл в корень проекта.
  2. В Visual Studio 2017 выполните публикацию с помощью веб-развертывания (убедитесь, что она установлена ​​на выпуск). Настройки будут автоматически подобраны.

Пример преобразования:

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

В последней версии 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

Исходя из ответа пользователя 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>

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

Сначала сделайте это: (ссылка: https://github.com/nil4/dotnet-transform-xdt)

  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. Проверить соединение и опубликовать

Развертывание по-прежнему загружает другие файлы конфигурации, не зная, как это остановить.

Это сработало для меня с 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>

Теперь это поддерживается dotnet publish из SDK версии 2.2 с целой кучей вариантов.

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

Я думаю, что в примере из вопроса, он будет работать, когда опубликован как

dotnet publish --configuration prod-zone-a

Может быть, я не ясен вопрос. В моем случае 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

Другие вопросы по тегам