Установить преобразование 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
работает отлично
Это сработало для меня:
- добавлять
web.release.config
файл в корень проекта. - В 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)
- Установить пакет -
dotnet add package DotNet.Xdt --version 2.1.0
- Изменить.csproj - добавить пакет - см. Github
- Изменить.csproj - добавить код преобразования (
ApplyXdtConfigTransform
) в конце - см. github - добавлять
web.DEV_Server.config
преобразовать файл, щелкнув правой кнопкой мыши наDEV_Server.pubxml
- Добавлено следующее к
web.DEV_Server.config
<environmentVariable xdt:Locator="Match(name)" name="ASPNETCORE_ENVIRONMENT" value="Development" xdt:Transform="SetAttributes" />
- изменять
DEV_Server.pubxml
изменить следующее значение настройки.
<LastUsedBuildConfiguration>DEV_Server</LastUsedBuildConfiguration>
- Проверить соединение и опубликовать
Развертывание по-прежнему загружает другие файлы конфигурации, не зная, как это остановить.
Это сработало для меня с 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 с целой кучей вариантов.
Я думаю, что в примере из вопроса, он будет работать, когда опубликован как
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