Подтвердить что ты не робот

Как обрабатывать преобразования конфигурации отладки/выпуска в 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?

4b9b3361

Ответ 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");
}