Как обрабатывать преобразования конфигурации отладки/выпуска в ASP.NET vNext
В предыдущих версиях ASP.NET многие из нас использовали Web.Debug.config
/Web.Release.config
файлы, которые выглядели бы примерно так:
Web.config
<connectionStrings>
<add name="AppDB" connectionString="Data Source=(LocalDb)\\..." />
</connectionStrings>
Web.Release.config
<connectionStrings>
<add name="AppDB" connectionString="Data Source=(ReleaseDb)\\..." xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
В соответствии с ASP.NET vNext учебник вы все равно можете использовать Web.config. Но теперь config.json
представляет собой новый способ обработки конфигураций в соответствии с той же статьей:
config.json
{
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\\..."
}
}
}
И в Startup.cs:
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
configuration.AddEnvironmentVariables();
Итак, мне интересно, что будет предлагаемым способом обработки config-transofrmation с этим сдвигом в json?
Ответы
Ответ 1
vNext использует новую систему конфигурации, в которой вы можете читать переменные среды через код. Итак, в этом случае вы должны проверить наличие соответствующей переменной окружения и включить соответствующий код JSON через код.
Например, вы можете создать qa.json и prod.json. Установите переменную среды, например, "ENV", которая указывает на "qa" и "prod" в этих средах. Затем условно вы можете добавить соответствующий JSON.
Код может выглядеть так:
1) default.json содержит все ваши файлы по умолчанию.
2) qa.json и prod.json содержат необходимые переопределения.
3) Так как qa.json и prod.json придут позже, они победят. Если в default.json и qa.json есть "setting1", он автоматически подберет "setting1" в qa.json
var configuration = new Configuration()
.AddJsonFile("default.json")
.AddEnvironmentVariables();
var envSpecificJson = configuration.Get("ENV") + ".json";
configuration.AddJsonFile(envSpecificJson);
Ответ 2
В то время как предыдущий ответ предлагает хорошее решение, я хотел бы представить альтернативный вариант:
код
var configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
Локальная среда:
Здесь у вас есть файл config.json со всеми настройками. Он легко редактируется и поддерживается.
Prod environment:
При развертывании вы опускаете файл config.json. Поскольку он отсутствует, код будет искать следующий источник в цепочке, который является переменными среды. Таким образом, на вашем локальном компьютере используйте файл конфигурации. Когда на сервере вернитесь к переменным среды. Обратите внимание, что ключи конфигурации должны, очевидно, быть одинаковыми в файле и переменных среды.
Ответ 3
По умолчанию ASP.NET будет проверять переменную среды с именем "ASPNET_ENV" для установки переменной IHostingEnvironment EnvironmentName.
Соответствующий код можно увидеть здесь:
https://github.com/aspnet/Hosting/blob/77e2dc263f11655312d4c73bb8e22d7b6254d485/src/Microsoft.AspNet.Hosting/HostingFactory.cs
Вы можете сделать что-то вроде следующего, если вы измените значение ASPNET_ENV на серверах в разных средах:
var configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
if (string.Equals(env.EnvironmentName, "Prod", StringComparison.OrdinalIgnoreCase))
{
configuration.AddJsonFile("prod.config.json");
}