Содержание
По умолчанию, в ASP.NET Core используется конфигурация приложения с использованием файлов JSON, однако, при желании, конфигурацию приложения можно определить и в других типах файлов, например, XML, INI или даже определить собственный формат файла конфигурации и использовать его.
Файловые провайдеры конфигурации
Для каждого источника конфигурации создается свой поставщик (провайдер). В случае, если для конфигурации приложения используются какие-либо файлы, то провайдерами выступают класс-наследники FileConfigurationProvider. Так, в ASP.NET Core уже определены следующие файловые провайдеры конфигурации:
IniConfigurationProvider– для использования конфигурации в виде INI-файлов;JsonConfigurationProviderиNewtonsoftJsonConfigurationProvider– для использования конфигурации в виде JSONXmlConfigurationProvider– для использования конфигурации в виде XML-файлов.
Для загрузки конфигурации из файлов применяются соответствующие методы расширения IConfigurationBuilder, например, AddJsonFile() для загрузки конфигурации из файла в формате JSON, AddXmlFile() – из XML-файла и так далее. Каждый из методов расширения также имеет перегруженные версии, позволяющие определять дополнительные настройки чтения конфигурационных файлов.
Работа с JSON-файлами конфигурации
Проект ASP.NET Core уже содержит JSON-файлы конфигурации, которые по умолчанию загружаются в приложении и могут использоваться для его настройки – это файлы appsettings.json и appsettings.Development.json
Второй JSON-файл демонстрирует возможность ASP.NET Core загружать определенные настройки приложения в зависимости от среды выполнения. Например, мы можем определить файлы формата appsettings.{EnvironmentName}.json и загружать только те настройки, которые необходимы при выполнении приложения в среде с именем EnvironmentName. Загрузка конфигурации из этих файлов осуществляется в следующем порядке:
- Загружаются настройки из файла
appsettings.json - Загружаются настройки из
appsettings.{EnvironmentName}.json, - Если оба файла содержат настройку с одинаковым ключом, то значение настройки применяется из последнего загруженного файла, то есть из
appsettings. {EnvironmentName}.json.
Преимуществом использования JSON-файлов конфигурации является то, что, используя их мы можем создавать довольно сложные структуры параметров приложения. Например, посмотрим на содержание файла appsettings.json, которое создается по умолчанию в приложении ASP.NET Core Web API
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Здесь мы можем видеть, что для настроек ведения журнала работы приложения используется отдельная секция (Logging), внутри которой определяется подсекция (LogLevel), которая уже, в свою очередь, содержит конкретные настройки ведения журнала. Мы можем определить в этом файле свои настройки и использовать их в приложении.
Например, создадим новое приложение ASP.NET Core Web API и добавим в файл appsettings.json следующие настройки
{
"Weather": {
"Count": 2
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Теперь перейдем к контроллеру WeatherForecastController и внесем в него следующие изменения:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly IConfiguration _config;
public WeatherForecastController(IConfiguration configuration)
{
_config = configuration;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var count = _config.GetSection("Weather").GetValue<int>("Count", 5);
return Enumerable.Range(1, count).Select(index => new WeatherForecast
{
Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
Здесь мы в конструкторе запрашиваем сервис конфигурации — IConfiguration и далее в методе Get() последовательно выполняем следующие действия:
- Запрашиваем секцию «Weather» из конфигурации
- Запрашиваем значение «Count» из секции. Если значение не было получено, то по умолчанию возвращается значение 5.
Таким образом, используя файл конфигурации мы регулируем количество элементов, которые вернет контроллер в ответ на наш запрос. Вот как будет выглядеть ответ сервера после запуска программы:
При необходимости мы можем разнести настройки нашего приложения по разным файлам JSON, подгрузив эти файлы при построении приложения. Для того, чтобы загрузить JSON-файл с конфигурацией приложения могут использоваться методы расширения, представленные в таблице
| Метод | Описание параметров |
public static AddJsonFile (this IConfigurationBuilder builder, IFileProvider? provider, string path, bool optional, bool reloadOnChange); |
|
public static IConfigurationBuilder AddJsonFile (this IConfigurationBuilder builder, string path, bool optional, bool reloadOnChange); |
См. описание параметров выше |
public static IConfigurationBuilder AddJsonFile (this IConfigurationBuilder builder, string path, bool optional); |
См. описание параметров выше |
public static IConfigurationBuilder AddJsonFile (this IConfigurationBuilder builder, string path); |
См. описание параметров выше |
public static IConfigurationBuilder AddJsonFile (this IConfigurationBuilder builder, Action<JsonConfigurationSource>? configureSource); |
configureSource – делегат, используемый для настройки источника конфигурации. |
Последняя версия метода AddJsonFile() с использованием делегата позволяет проводить более тонкую настройку источника конфигурации. Например, создадим в папке с проектом новый файл с именем properties.json
и определим в нем следующие настройки:
{
"Weather": {
"count": 1
}
}
Здесь мы задали новое значение для параметра Count. Теперь добавим этот файл в конфигурацию приложения, используя метод AddJsonFile(). Для этого изменим файл Program.cs как показано ниже
builder.Configuration.AddJsonFile((config) =>
{
config.Path = "properties.json";
config.Optional = true;
config.ReloadOnChange = true;
config.ReloadDelay = 1000;
});
// Add services to the container.
builder.Services.AddControllers();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
В вызове метода AddJsonFile() мы указали путь к файлу (файл должен находиться рядом с exe-файлом приложения), а также указали, что файл является необязательным (так как настройки с точно такими же ключами у нас уже имеются в файле appsettings.json) и необходимо его перезагрузить в случае изменения. При этом, в свойстве ReloadDelay указан размер задержки в миллисекундах перед тем, как файл будет перезагружен.
Теперь запустим приложение и выполним запрос из http-файла. Вы должны увидеть, что применились настройки именно из файла properties.json так как этот файл был загружен последним.
Подобным образом мы можем добавлять в конфигурацию приложения любое количество JSON-файлов, каждый из которых может содержать различные настройки приложения. Однако, стоит ещё раз обратить внимание на то, каждый очередной JSON-файл добавляется в конец иерархии и перезаписывает значения настроек с одинаковыми ключами.
Теперь можете, не закрывая приложение, изменить значение Count в файле properties.json и через секунду снова выполнить запрос к контроллеру — вы увидите, что контроллер вернет количество элементов массива, учитывая новое значение Count.
Работа с XML- и INI-файлами конфигурации
Что касается работы с XML- и INI-файлами конфигурации в ASP.NET Core, то она реализована в точности также, как и с JSON-файлами – для XML-файлов используется провайдер конфигурации XmlConfigurationProvider и методы расширения AddXmlFile(), а для INI-файлов – провайдер IniConfigurationProvider и методы расширения AddIniFile(). Методы расширения содержат параметры аналогичные тем, которые перечислены в таблице выше. Различие состоит только в формате используемых файлов. Поэтому нет смысла занимать лишнее время на рассмотрение примеров использования XML- и INI-файлов конфигурации в наших приложениях, и мы можем приступить к следующей группе провайдеров конфигурации – нефайловым провайдерам.
Итого
Файловые провайдеры позволяют создавать конфигурации с разветвленной структурой, помещая отдельные настройки в секции и подсекции. Для конфигурации приложения мы можем использовать json-файлы, xml-файлы и ini-файлы. Конфигурацию приложения можно разносить по нескольким файлам. При этом, настройки с одинаковыми именами ключей перезаписываются последним прочитанным значением.



