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

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

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


person user1820686    schedule 29.03.2017    source источник


Ответы (8)


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

  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>

Обновление: если вы хотите удалить файл 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>
person Sha    schedule 15.02.2019
comment
У меня это сработало, но мне пришлось добавить дополнительный тег ‹location› между тегами ‹configuration› и ‹system.webServer›, чтобы соответствовать формату конфигурации для шаблона проекта ASP.NET Core Web Application. - person Wes Grant; 16.05.2020
comment
Спасибо за преобразование образца, работает как шарм! - person RobCo; 02.06.2020
comment
Спасибо, но web.Release.config все еще существует после публикации :( какой-либо законный способ избавиться от него? - person Dmitry Gusarov; 29.12.2020
comment
@DmitryGusarov - Я добавил код для вашей конкретной проблемы. - person Sha; 29.12.2020

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

person user1820686    schedule 30.03.2017

В последней версии dotnet cli (2.1.400 или выше) вы можете просто установить это свойство msbuild $ (EnvironmentName), и инструменты публикации позаботятся о добавлении переменной среды ASPNETCORE_ENVIRONMENT в web.config с указанным именем среды.

Кроме того, поддержка XDT доступна начиная с версии 2.2.100-preview1.

Пример: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md

person vijayrkn    schedule 24.08.2018
comment
В текущей версии 2.2 отлично работает, чтобы добавить ASPNETCORE_ENVIRONMENT, используя: dotnet publish (projectlocation) /p:EnvironmentName=PreProduction - person XaviGuardia; 26.02.2019

Следуя ответу 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>
person squeakyD    schedule 12.04.2018

Веб-развертывание IIS ASP.NET Core (2.1) в Visual Studio 2017 (VS2017)

Сначала сделайте следующее: (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 по-прежнему загружает другие файлы конфигурации, не знаю, как это остановить.

person SamJackSon    schedule 27.08.2018

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

person Andrey Ravkov    schedule 27.06.2017

Теперь это поддерживается 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

person Daniel Edwards    schedule 01.05.2019

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