1.3. Работа с конфигурацией

Если у вас уже есть опыт создания Web приложений на .NET, то вы скорей всего работали с конфигурационными файлами в XML формате. Самый основной файл web.config тоже имеет XML структуру.

В .NET Core разработчики решили перейти по максимуму на JSON, который более легкий, занимает меньше места на диске и проще писать парсер, а значит он и работать будет быстрее.

При созданрии нового проекта Visual Studio уже создал для нас конфигурационный файл по умолчанию – appsettings.json. У меня в этой файле уже есть несколько строчек:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

Эту информацию будет использовать веб сервер Kestrel, который и будет выполнять код, когда мы запускаем приложение. Тут ему сообщается, что нужно по умолчанию использовать уровень регистрации события Warning и разрешать подключения со всех хостов. Это все.

Опять же, если вы работали со старым ASP.NET, то скорей всего видели его web.config файл, в котором огромное количество настроек. В нашем случае только два параметра и то не обязательные. Попробуйте удалить все строки в файле и оставить только:

{
}

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

Глядя на место, где произошла ошибка можно догадаться, что конфигурация из appsettings.json загружается при создании Web хоста по умолчанию WebHost.CreateDefaultBuilder.

Но если даже этот файл не создан или мы его удалим? Сайт будет работать. Kestrel сможет запустить на выполнение сайт если его конфигурационный файл корректный или отсутствует. Можете попробовать удалить в файловом менеджере файл appsettings.json и запустить сайт и он выполниться.

Вернем файл на родину, а для этого его можно создать в файловом менеджере или в VS. Щелкните правой кнопкой по имени проекта и выберите Add->New Item:

В появившемся окне можно выбрать совершенно любой шаблон. Это всего лишь шаблоны, от выбора которого будет зависеть то, что в результате VS поместит в файл. Для нас главное указать правильно имя файла, а сгенерированное содержимое мы всегда можем удалить и заменить на корректный JSON формат. Я выбрал Application Configuration File и указал нужное мне имя файла внизу:

У меня VS после создания файла поместил в него XML шаблон, который я без проблем удаляю и теперь мы можем создать какой-то собственный параметр и попробовать воспользоваться им в нашем коде. Давайте создадим параметр HelloMessage и значение этого параметра будем отображать на странице:

{
  "HelloMessage":  "Привет из .NET Core"
}

Как теперь получить доступ к этому параметру из кода? Мы уже знаем, что Kestrel уже загрузил эти данные и нам не нужно ничего самим пытаться загружать, а значит должен быть простой способ. И он есть.

.NET Core использует везде инъекцию зависимостей. У нас в файле Startup.cs есть метод Configure, который через параметры получает два объекта:

  public void Configure(IApplicationBuilder app, 
    IHostingEnvironment env)

Cтоит нам добавить IConfiguration, и .NET Core предоставит нам реализацию этого интерфейса, которая позволяет работать с загруженной конфигурацией:

  public void Configure(IApplicationBuilder app, 
    IHostingEnvironment env, IConfiguration config)

Теперь через переменную config мы можем прочитать нашу переменную config["HelloMessage"]:

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/", async context =>
    {
        await context.Response.WriteAsync(config["HelloMessage"]);
    });
});
 

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

Исходник

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне