Почему Host.CreateApplicationBuilder из ASP.NET Core не находит appsettings.json?
Cоздаю приложение с помощью ASP.NET Core 7. Но не могу понять, почему я не могу получить значения из appsettings.json? loggingEnv почему-то пустой. Хотя документация говорит, что appsettings.json загружается автоматически из текущей директории.
appsettings.json находится в той же директории, что и Program.cs. Пробовал еще переносить appsettings.json в /Properties, но тоже не помогает.
Если при запуске кода поставить брейкпоинт, то builder.Environment.ContentRootPath будет равен ...ProjectFolder\bin\Debug\net7.0, но разве так должно быть? Разве он не должен быть просто ...ProjectFolder?
Program.cs
var builder = Host.CreateApplicationBuilder();
var loggingEnv = builder.Configuration.GetSection("Logging").GetChildren();
var app = builder.Build();
app.Run();
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
},
"File": {
"Path": "Temp/app.log",
"Append": true,
"MinLevel": "Information",
"FileSizeLimitBytes": 0,
"MaxRollingFiles": 1
}
}
}
Ответы (2 шт):
Можно использовать (using Microsoft.Extensions.Configuration):
var builder = new ConfigurationBuilder()
.AddJsonFile($"appsettings.json", true, true);
Также можно использовать (using System.Text.Json.Serialization):
builder.Services.AddControllers()
.AddJsonOptions(o => o.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
Привел пример для ASP.NET Core и Console App.
Проблема в builder.Environment.ContentRootPath. Он ...ProjectFolder\bin\Debug\net7.0 вместо ...ProjectFolder. Сейчас просто задал директорию вот так:
var builder = Host.CreateApplicationBuilder();
var projectPath = Directory.GetParent(Directory.GetCurrentDirectory())?.Parent?.Parent?.FullName;
ArgumentNullException.ThrowIfNull(projectPath);
builder.Configuration.SetBasePath(projectPath);
builder.Configuration.AddJsonFile("Properties/appsettings.json", true, true);
var app = builder.Build();
app.Run();
Но странно почему пришлось это делать, потому что есть другой проект, в котором всё работает без этого (работает как в вопросе).