Какие значения WebHost считывает из appsettings.json

В .Net Core вы можете самостоятельно разместить веб-сервер, используя WebHost. Существует метод CreateDefaultBuilder(), к которому относится в документации Microsoft говорится следующее:

CreateDefaultBuilder выполняет следующие задачи:

  • Загружает конфигурацию приложения из:
  • appsettings.json.

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

Например, я попытался добавить следующее в свой appsettings.json, но сервер все равно запускается с http://localhost:5000:

{
  "Kestrel" : {
    "urls" : "http://*:8080"
  },
  "server" : {
    "urls" : "http://*:8080"
  }
}

Я знаю, что могу читать appsettings.json самостоятельно, используя ConfigurationBuilder, но это противоречит цели документации.

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


person GTHvidsten    schedule 25.08.2018    source источник


Ответы (1)


Почему CreateDefaultBuilder не настраивает узел со значениями appsettings.json?

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

  • Loads host configuration from:
    • Environment variables prefixed with ASPNETCORE_ ...
    • Аргументы командной строки.
  • Loads app configuration from:
    • appsettings.json.
    • appsettings.{Среда}.json.

Изнутри CreateDefaultBuilder причина, по которой appsettings.json автоматически не влияет на хост, заключается в том, что эти параметры настраивают приложение, а конфигурация приложения не влияет на конфигурацию хоста. В документации указано, что когда говорится:

IWebHostBuilder добавляется в конфигурацию приложения, но обратное неверно — ConfigureAppConfiguration не влияет на конфигурацию IWebHostBuilder.

Глядя на исходный код показывает, что метод CreateDefaultBuilder только добавляет значения appsettings.json из своего вызова к ConfigureAppConfiguration. Вот почему эти значения не влияют автоматически на хост.

Как мы можем настроить хост со значениями из файла *.json?

CreateDefaultBuilder не настраивает хост автоматически с помощью файла *.json. Нам нужно сделать это вручную, и в документации указано, как. В примере файл называется hostsettings.json, и пример добавляет его явно так:

var config = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("hostsettings.json")
    .Build();

return WebHost.CreateDefaultBuilder(args)
    // this impacts *both* host and app config
    .UseConfiguration(config) 
    .UseStartup<Startup>();

В имени hostsettings.json нет никакой магии. Фактически, мы могли бы объединить настройки нашего хоста и настройки нашего приложения в один файл с именем appsettings.json. То, как работает CreateDefaultBuilder, подталкивает нас к разделению этих настроек.

Какие ключи мы можем поместить в файл *.json для настройки хоста?

Это список ключей который мы можем использовать для настройки хоста:

"applicationName"
"startupAssembly"
"hostingStartupAssemblies"
"hostingStartupExcludeAssemblies"
"detailedErrors"
"environment"
"webroot"
"captureStartupErrors"
"urls"
"contentRoot"
"preferHostingUrls"
"preventHostingStartup"
"suppressStatusMessages"
"shutdownTimeoutSeconds"
person Shaun Luttin    schedule 25.08.2018
comment
Спасибо за исчерпывающий ответ! Я предполагаю, что разница между конфигурацией хоста и приложения и отсутствием автозагрузки недостаточно очевидна, и что в конце концов я должен использовать ConfigurationBuilder (не то, чтобы с этим что-то не так). - person GTHvidsten; 26.08.2018
comment
Пожалуйста. Я рад слышать, что ответ помог. :-) - person Shaun Luttin; 26.08.2018