Загрузите файл appsettings. {EnvName} .json в ASP.NET Core 2.1 - PullRequest
0 голосов
/ 07 октября 2018

В предыдущих версиях ASP.NET Core мы могли динамически добавлять файлы appsetting.json с суффиксом среды, например appsettings.Production.json, для производственной среды.

Поскольку структура немного отличается, кажется, что конфигурация теперь загружена в классе Program.Но здесь мы не вводили ``, поэтому я попробовал сам, используя переменную окружения:

public class Program {
        public static void Main(string[] args) {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
            string envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
            string envConfigFile = $"appsettings.{envName}.json";

            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile(envConfigFile, optional: true);

            var finalConfig = config.Build();
            return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://0.0.0.0:5000")
                .UseConfiguration(finalConfig)
                .UseStartup<Startup>();
        }
    }

Код был выполнен, но он не переопределяет мою конфигурацию appsettings.json.Допустим, у меня есть следующее appsettings.json:

{
    "MyConnectionString": "Server=xxx,Database=xxx, ..."
}

Эта ConnectionString работает.Теперь я создаю appsettings.Development.json

{
    "MyConnectionString": ""
}

и устанавливаю ASPNETCORE_ENVIRONMENT=Development.Это должно определенно бросить исключение.Но приложение запускается правильно с ConnectionString из appsettings.json.

В соответствии с изменениями конфигурации ASP.NET Core 2 , метод WebHost.CreateDefaultBuilder должен сам использовать новый подход ConfigureAppConfiguration и загружать конфигурацию, специфичную для среды, по умолчанию.Также официальные документы говорят, что appsettings.{Environment}.json загружаются автоматически.Но это не работает, а также загрузка вручную, так как это не решает проблему:

return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://0.0.0.0:5000")
                .ConfigureAppConfiguration((builderContext, config) => {
                    IHostingEnvironment env = builderContext.HostingEnvironment;
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
                })
                .UseStartup<Startup>();

Как я могу переопределить конфигурацию, используя шаблон "appsettings.{envName}.json"?Мне понравилось это, потому что было удобно переопределить env конкретные вещи в ASP.NET Core.

Ответы [ 6 ]

0 голосов
/ 26 июля 2019

Переменная среды Параметры Image

На основе настроек переменных среды мы можем использовать файл appsettings.environment.json в качестве файла конфигурации

 public Startup(IHostingEnvironment env)
            {
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
                Configuration = builder.Build();
            }
0 голосов
/ 12 июля 2019

Согласно документации, поставщик конфигурации JSON должен автоматически загружаться дважды в ASP.NET Core 2.1 ASP.NET Core 2.1 ) при использовании CreateDefaultBuilder (поэтому переместитекод из отдельного ConfigurationBuilder).

AddJsonFile автоматически вызывается дважды, когда вы инициализируете новый WebHostBuilder с CreateDefaultBuilder.Метод вызывается для загрузки конфигурации из:

  • appsettings.json - Этот файл сначала читается.Версия файла среды может переопределять значения, предоставленные файлом appsettings.json .
  • appsettings. {Environment} .json - версия файла средызагружается на основе IHostingEnvironment.EnvironmentName .

Их пример:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddJsonFile(
                "config.json", optional: true, reloadOnChange: true);
        })

(Если вы хотите использовать строки подключения при запуске(UI MVC), для добавления миграций в другой проект миграции вы можете проверить этот ответ .)

0 голосов
/ 13 октября 2018

Обнаружил, что у меня есть пользовательский класс DesignTimeDbContextFactory для миграций:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> {
        public ApplicationDbContext CreateDbContext(string[] args) {
            var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
            string connectionString = Config.GetConnectionString("AppDbContext");
            builder.UseMySql(connectionString);

            return new ApplicationDbContext(builder.Options);
        }
    }

Так как внедрение конфигурации здесь не работает (в то время я получал ошибки для строк подключения)при использовании класса Startup по умолчанию) я написал некоторый класс конфигурации:

public class Config {
        static IConfigurationRoot config;
        static IConfigurationRoot AppConfig {
            get {
                if (config == null) {
                    config = new ConfigurationBuilder()
                             .SetBasePath(Directory.GetCurrentDirectory())
                             .AddJsonFile("appsettings.json")
                             .Build();
                }
                return config;
            }
        }
        public static string GetConnectionString(string name) {
            var connectionString = AppConfig.GetConnectionString(name);
            return connectionString;
        }
    }

Таким образом, проблема заключалась в том, что стандартное ядро ​​ASP.NET ConfigureAppConfiguration не использовалось для согласованности.Вместо этого мое решение загружает только appsettings.json, так как на момент написания этого класса не использовалась конфигурация для конкретной среды.

Мне просто нужно добавить загрузку вот так:

    static IConfigurationRoot AppConfig {
        get {
            if (config == null) {
                var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
                config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddJsonFile("appsettings.json")
                         // https://github.com/aspnet/MetaPackages/blob/rel/2.0.0/src/Microsoft.AspNetCore/WebHost.cs
                         .AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
                         .Build();
            }
            return config;
        }
    }

Буду признателен, если у кого-то есть более чистое решение, позволяющее мне использовать подход по умолчанию ConfigureAppConfiguration в миграциях EFпотому что это кажется менее подверженным ошибкам при использовании такого материала по умолчанию вместо пользовательских методов.

0 голосов
/ 07 октября 2018

Попробуйте использовать CreateDefaultBuilder(), который должен предоставить вам необходимые параметры конфигурации (как в примере в документах ).Обратите внимание, что если вы работаете в Linux, он чувствителен к регистру - если имя файла имеет заглавную букву P для Production, значение переменной среды также должно быть.Также проверьте, что файлы находятся в правильном каталоге - выведите значение Directory.CurrentDirectory() во время выполнения.Вот где они должны быть.

Если это работает, но вы на самом деле не хотите использовать конструктор по умолчанию, просто скопируйте нужные вам детали из источника .

0 голосов
/ 07 октября 2018

Вам нужно перейти к своему решению в Visual Studio 2017c. Нажмите на решение, в меню выберите Свойства> построить, и вы увидите, что переменная среды уже создана для среды с именем Разработка.Если вы переопределите это значение на странице свойств для данного веб-проекта, оно извлечет переменные среды из параметров приложения, специфичных для среды приложения.Я бы также оставил код по умолчанию для вашего веб-хостера, если ваша версия 2.1 или выше

0 голосов
/ 07 октября 2018

Вы должны проверить настройки сборки.Если вы хотите, чтобы ваш проект загружал определенную среду, вы должны указать компилятору, какие параметры среды вы хотите загрузить.

Надеюсь, это поможет.Удачи.

...