Мы создаем веб-приложение с использованием новой платформы ASP.NET 5. Я настраиваю средства автоматизации сборки и развертывания, и я хочу иметь возможность изменять параметры приложения во время развертывания (например, изменять URL-адрес веб-сервиса). В ASP.NET 5 у нас больше нет файлов web.config, а только новые файлы конфигурации json. Есть ли механизм в ASP.NET 5, аналогичный преобразованию web.config в предыдущих версиях ASP.NET?Преобразование конфигурационного файла в ASP.NET 5
ответ
Вам не нужны конфигурационные преобразования в ASP.NET 5, так как у него есть встроенная поддержка цепочечных источников конфигурации. Например, возьмем this sample:
public class Startup
{
private readonly IConfiguration _configuration;
public Startup(IApplicationEnvironment appEnv, IHostingEnvironment env)
{
_configuration = new ConfigurationBuilder(appEnv.ApplicationBasePath)
.AddJsonFile("config.json")
.AddEnvironmentVariables()
.Build();
}
// ...
}
Мы добавляем два источника конфигурации и создания конфигурации НАШИХ из них. если я попрошу ключ конфигурации, он попытается получить значение для этого ключа, посмотрев на источники от последнего до первого порядка. В вышеприведенном случае я могу работать с файлом config.json во время разработки, и я могу использовать его, предоставляя правильную конфигурацию из переменных среды.
Дополнительную информацию смотрите на странице the Configuration docs.
Как указано в @tugberk, вместо этого вы можете использовать переменные окружения, что является гораздо лучшим способом справиться с этой ситуацией. Если вы работаете в среде разработки и хотите хранить пароли или строки подключения, вы также можете использовать секреты пользователей, чтобы добавить их. В конце концов, что вы можете все еще использовать среды специфические конфигурационные файлы, как это (Это ASP.NET 5 Beta 5 Sample):
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(
applicationEnvironment.ApplicationBasePath);
// Add configuration from the config.json file.
configurationBuilder.AddJsonFile("config.json");
// Add configuration from an optional config.development.json, config.staging.json or
// config.production.json file, depending on the environment. These settings override the ones in the
// config.json file.
configurationBuilder.AddJsonFile($"config.{hostingEnvironment.EnvironmentName}.json", optional: true);
if (hostingEnvironment.IsEnvironment(EnvironmentName.Development))
{
// This reads the configuration keys from the secret store. This allows you to store connection strings
// and other sensitive settings on your development environment, so you don't have to check them into
// your source control provider. See http://go.microsoft.com/fwlink/?LinkID=532709 and
// http://docs.asp.net/en/latest/security/app-secrets.html
configurationBuilder.AddUserSecrets();
}
// Add configuration specific to the Development, Staging or Production environments. This config can
// be stored on the machine being deployed to or if you are using Azure, in the cloud. These settings
// override the ones in all of the above config files.
// Note: To set environment variables for debugging navigate to:
// Project Properties -> Debug Tab -> Environment Variables
// Note: To get environment variables for the machine use the following command in PowerShell:
// $env:[VARIABLE_NAME]
// Note: To set environment variables for the machine use the following command in PowerShell:
// $env:[VARIABLE_NAME]="[VARIABLE_VALUE]"
// Note: Environment variables use a colon separator e.g. You can override the site title by creating a
// variable named AppSettings:SiteTitle. See
// http://docs.asp.net/en/latest/security/app-secrets.html
configurationBuilder.AddEnvironmentVariables();
IConfiguration configuration = configurationBuilder.Build();
Я знаю, что web.configs на самом деле не поддерживаются, но они все еще используются в ASP.Net под IIS.
У меня было желание применить преобразования, а также я хотел контролировать переменную окружения от конфигурации следующим образом:
<aspNetCore>
<environmentVariables xdt:Transform="Replace">
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
</environmentVariables>
</aspNetCore>
Если вы действительно хотите, чтобы превратить их в ядра ASP.Net/5 вы можете использовать следующий метод:
Добавить в много различных web.config преобразования файлов, как вы хотите, чтобы ваш проекта. Например, вы можете добавить Web.Development.config, Web.Staging.config и Web.Production.config и т. Д. Назовите их, как вам нравится.
Измените файл project.json для вывода файлов, добавив эту строку в publishoptions прямо ниже текущей строки web.config: «. Интернет * конфигурации»
Вход Создать профиль и публикации изменить свой Powershell скрипт для вашего профиля публикации (находится в Project Web \ Свойства \ PublishProperties \ ProfileName-publish.ps1) добавить следующие модификации:
Добавьте эту функцию выше попытке поймать (я нашел эту функцию здесь Web.Config transforms outside of Microsoft MSBuild?, немного модифицировано.):
function XmlDocTransform($xml, $xdt)
{
if (!$xml -or !(Test-Path -path $xml -PathType Leaf)) {
throw "File not found. $xml";
}
if (!$xdt -or !(Test-Path -path $xdt -PathType Leaf)) {
throw "File not found. $xdt";
}
"Transforming $xml using $xdt";
$scriptPath = (Get-Variable MyInvocation -Scope 1).Value.InvocationName | split-path -parent
#C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll
Add-Type -LiteralPath "${Env:ProgramFiles(x86)}\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.XmlTransform.dll"
$xmldoc = New-Object Microsoft.Web.XmlTransform.XmlTransformableDocument;
$xmldoc.PreserveWhitespace = $true
$xmldoc.Load($xml);
$transf = New-Object Microsoft.Web.XmlTransform.XmlTransformation($xdt);
if ($transf.Apply($xmldoc) -eq $false)
{
throw "Transformation failed."
}
$xmldoc.Save($xml);
}
Добавьте эти строки ВЫШЕ в Publish-сети САШ, вызов:
$xdtFiles = Get-ChildItem $packOutput | Where-Object {$_.Name -match "^web\..*\.config$"};
$webConfig = $packOutput + "web.config";
foreach($xdtFile in $xdtFiles) {
XmlDocTransform -xml $webConfig -xdt "$packOutput$xdtFile"
}
Мне досадно, что они добавили эти обязательные переменные ASPNETCORE_ENVIRONMENT без какого-либо простого способа контролировать их на основе профиля публикации! – Sprintstar
Похоже, что последняя строка в методе XmlDocTransform неверна. Он должен быть $ xmldoc.Save ($ xml); работать. Кроме того, это действительно удобный скрипт, хороший! –
@Svein Fidjestøl Svein, это на самом деле то, как я хотел сохранить файлы. Как file.environment.config. Мы используем развертывание octopus для развертывания наших файлов, и в рамках нашего процесса развертывания мы создаем правильную конфигурацию. Мне нравится ваше изменение как альтернатива другим людям, которые не хотели, чтобы это работало таким образом, но это было сделано специально. :) – SpaceGhost440
спасибо! Я уже смотрел ConfigurationBuilder, но ваша мысль об обратном порядке прояснила все. –