У меня есть несколько проектов, которые используют один и тот же файл appsettings.json.
Когда я добавляю файл appsettings.json в каждый проект отдельно, мои проекты запускаются и загружают конфигурацию из этих файлов.
Я хотел бы иметь один файл, на который я ссылаюсь (Добавить -> Существующий -> Добавить как ссылку), чтобы у меня был один единственный файл для обслуживания.
При этом мой файл .proj изменяет файлы:
<ItemGroup>
<Content Include = "..\Master\appsettings.Development.json" Link = "appsettings.Development.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include = "..\Master\appsettings.json" Link = "appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
Когда я делаю сборку, я вижу оба параметра приложения в каталоге bin\Debug\netcoreapp3.1.
Мой стартап:
public static void Main(string[] args)
{
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
var lConfiguration = hostContext.Configuration;
ServiceConfiguration lOptions = lConfiguration.GetSection(nameof(ServiceConfiguration)).Get<ServiceConfiguration>();
services.AddSingleton(lOptions);
})
.UseSerilog((hostingContext, loggerConfiguration) =>
loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration)
);
Однако, когда я отлаживаю свой проект и проверяю объект конфигурации, я вижу все источники конфигурации, но источник appsettings пуст.
Я в замешательстве, так как файл appsettings строится, но конфигурация его не подхватывает.
Что мне не хватает?
Я использую готовую конфигурацию. Я бы предпочел не делать настройку вручную. Раньше я вручную указывал файлы конфигурации (согласно вашему примеру), но не понимаю, зачем мне это нужно делать сейчас. Я редактирую свой вопрос с помощью своего запуска.
@PeterCsala нет, я думаю, вы неправильно понимаете концепцию или мое объяснение. Итак, у меня есть один файл настроек приложения, который живет внутри моего «главного» проекта. в других проектах нет файла appsettings.json в исходном каталоге. Когда проект(ы) строится, он извлекает настройки приложения из папки «главного» проекта и помещает их в двоичную папку. Эта механика работает отлично. Реализация в Visual Studio для этого также великолепна. Кажется, что файлы есть везде, но на самом деле это один файл. Когда редактируешь, меняется везде. Я опубликую ответ на это сейчас.
Извините, я неправильно понял ваше намерение.
Проблема заключалась в том, что рабочим каталогом в .NET Core по умолчанию является исходная папка, а не папка с двоичными файлами. Это означает, что он искал файл appsettings.json в моей исходной папке, который был бы там, если бы я добавил файл appsettings вручную, но когда я связал его, его не было в исходной папке.
Проблема была решена путем изменения рабочего каталога по умолчанию на двоичную папку, выполнив следующие действия:
Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
Есть еще один способ, с помощью которого вы можете контролировать, откуда будет запускаться приложение. Вы можете изменить файл launchSettings.json
, чтобы добавить настройку workingDirectory
в свой профиль запуска. Просто укажите его в выходной папке bin:
{
"profiles": {
"Project1": {
"commandName": "Project",
"workingDirectory": "bin/Debug/net6.0",
"dotnetRunMessages": true,
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Development"
}
}
}
}
Как вы строите свою конфигурацию? Это должно выглядеть примерно так:
new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true).AddEnvironmentVariables().Build();