.NET Core Web API: автоматическая загрузка неправильного файла appsettings.json - PullRequest
0 голосов
/ 12 марта 2019

У нас есть проект .NET Core 2.2 Web API, и мы используем следующий код для загрузки соответствующего файла appsettings.json на основе флагов сборки DEBUG или RELEASE.

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseConfiguration(new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
#if DEBUG
        .AddJsonFile("appsettings.Development.json")
#endif
#if RELEASE
        .AddJsonFile("appsettings.Production.json")
#endif
        .AddJsonFile("appsettings.json")
        .Build()
    )
    .UseStartup<Startup>()
    .Build();

Мы создаливнешний проект, который вызывает один и тот же метод внутри Topshelf проекта службы Windows.

Странно то, что файл appsettings.Production.json всегда загружается, независимо от того, отлаживаем мы или выпускаемпроект.

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Сделайте что-то вроде следующего и установите переменную среды в ОС хост-системы:

var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

public static IWebHost BuildWebHost(string[] args) =>
  WebHost
    .UseConfiguration(new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())

    .AddJsonFile($"appsettings.json", true, true)
    .AddJsonFile($"appsettings.{environmentName}.json", true, true)

    .Build()
  )
  .UseStartup<Startup>()
  .Build();

Редактировать: Удалено CreateDefaultBuilder ()

Взгляните на https://andrewlock.net/exploring-program-and-startup-in-asp-net-core-2-preview1-2/#setting-up-app-configuration-in-configureappconfiguration

0 голосов
/ 12 марта 2019

Ознакомьтесь с документацией для CreateDefaultBuilder()

Примечания

Следующие значения по умолчанию применяются к возвращенному WebHostBuilder:

  • использовать Kestrel в качестве веб-сервера и настроить его с помощью провайдеров конфигурации приложения,
  • установить ContentRootPath на результат GetCurrentDirectory (),

  • загрузить IConfiguration из appsettings.json и appsettings.[EnvironmentName].json,

  • загрузить IConfiguration из секретов пользователя, когда EnvironmentName имеет значение «Разработка», используя сборку ввода,

  • загрузить IConfiguration из переменных среды,

  • загрузить IConfiguration из предоставленных аргументов командной строки,

  • настроить ILoggerFactory для входа в консоль и отладки вывода,

  • и включите интеграцию с IIS.

Номер 3 в этом списке всегда будет смотреть на значение переменной среды ASPNETCORE_ENVIRONMENT (по умолчанию «Производство», если не указано) и пытается загрузить файл appsettings с этим именем.

Вместо того, чтобы изменять свой код или использовать директивы препроцессора, просто измените значение этой переменной среды (например, на «Разработка»).

Вот как работает ваш launchSettings.json файл:

"profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/values",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
  ...

Не боритесь с CreateDefaultBuilder() - ваш опубликованный код делает так много шагов, что метод уже делает для вас (загрузка файлов, установка базового пути и т. Д.).

Это Program.cs по умолчанию, предоставленный вам с проектами ASP.Net Core, и он будет работать для вас просто отлично:

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

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

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

...