В .NET Core 8 appsettings.json не используется по умолчанию, когда используется файл с определенной средой

Вопрос или проблема

Я работал с Java последние несколько лет и сейчас снова начинаю заниматься dotnet. У меня возникают проблемы с настройкой конфигураций так, как мне хотелось бы. Я хочу иметь такую структуру:

  • appsettings.json — настройки по умолчанию, независимые от окружения
  • appsettings.local.json — локальные специфические переопределения конфигурации
  • appsettings.dev.json — специфические переопределения конфигурации для разработки
  • appsettings.stage.json — специфические переопределения конфигурации для стадии

Проблема, с которой я сталкиваюсь, заключается в том, что когда используется файл appsettings.local.json (или любой другой файл специфического окружения), базовые значения в файле appsettings.json не загружаются, даже если файл appsettings.local.json не переопределяет их.

Код настройки конфигурации:

var builder = WebApplication.CreateBuilder(args);

var configuration = builder.Configuration;

configuration
    .AddEnvironmentVariables()
    .Build();

appsettings.json:

{ 
...    
"Mctv": {
  "Port": "8080",
  "CORS": {
...

appsettings.local.json:

{
...
  "Mctv": {
    "Run-Environment": "local",
    "CORS": {
...

Обратите внимание, что настройка Port не указана в файле appsettings.local.json, я хочу, чтобы использовалось значение из файла appsettings.json. Как мне это настроить, чтобы конфигурация, независимая от окружения, в appsettings.json учитывалась, когда она не переопределена значением в файле конфигурации специфического окружения?

Сейчас, когда я запускаю с

“ASPNETCORE_ENVIRONMENT”: “local”

используются только значения из файла application.local.json.

–ИЗМЕНЕНИЕ

Я видел несколько сообщений в Интернете, которые советуют делать что-то вроде этого:

var builder = WebApplication.CreateBuilder(args);

var configuration = builder.Configuration;
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

configuration
    .AddEnvironmentVariables()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", reloadOnChange: true, optional: false)
    .AddJsonFile($"appsettings.{environmentName}.json", reloadOnChange: true, optional: true)
    .Build();

Но я получаю такое же поведение, когда пробую это.

Ответ или решение

Для того чтобы обеспечить загрузку значений из файла appsettings.json, когда соответствующее значение не переопределяется в файле среды (например, appsettings.local.json), необходимо правильно настроить порядок загрузки конфигурации в вашем приложении .NET Core.

Вот пример правильной настройки использования конфигурационных файлов:

var builder = WebApplication.CreateBuilder(args);

// Получаем имя текущей среды
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";

// Настраиваем конфигурацию
builder.Configuration
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
    .AddEnvironmentVariables();

var app = builder.Build();

Объяснение:

  1. Порядок добавления файлов конфигурации: Важно добавлять файлы конфигурации в правильном порядке. Сначала загружается appsettings.json, в который помещаются основные, общие для всех сред настройки. Затем загружается файл для конкретной среды (например, appsettings.local.json), где могут находиться специфические настройки. Если определённое значение в более специфичном файле отсуствует, то будет использовано значение из appsettings.json.

  2. Параметры метода AddJsonFile:

    • optional: false для основного файла appsettings.json позволяет гарантировать, что приложение не запустится, если этот файл отсутствует.
    • optional: true для среды позволяет приложению продолжать работать, даже если файл среды (например, appsettings.local.json) отсутствует.
  3. Использование переменной окружающей среды для имени среды: С помощью Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") вы динамически получаете имя среды, которая задается в вашем приложении. Если переменная не задана, в качестве значения по умолчанию используется Production.

Заключение

С данной конфигурацией ваше приложение будет корректно загружать значения из appsettings.json, если соответствующие ключи отсутствуют в файле среды. Таким образом, вы получите желаемую конфигурационную структуру для разных сред разработки и сможете избежать проблем с переопределением значений.

Оцените материал
Добавить комментарий

Капча загружается...