Я запускаю приложение .net core 2.1 на Mac и пытаюсь получить доступ к строке подключения, которая должна быть переопределена моими пользовательскими секретами. Файл .csproj содержит руководство
<UserSecretsId>{{Secret Guid}}</UserSecretsId>
Добавьте секретные ключи пользователя
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Secret Connection String"
Я создаю конфигурацию, которая отлично читает мой файл appsettings.json, однако она не заменяет значения по умолчанию значениями из моих пользовательских секретов.
// this is done so I build my configurations in a class library
var assembly = AppDomain.CurrentDomain.GetAssemblies()
.Single(o => o.EntryPoint != null);
var configurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables()
// .AddUserSecrets<Program>() -> This does not work either
.AddUserSecrets(assembly, optional: false);
configurationBuilder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
var configuration = configurationBuilder.Build();
Console.WriteLine(configuration["ConnectionStrings:DefaultConnection"]);
Как я уже говорил ранее, пытаясь получить доступ к значениям, он не заменяет значения значениями пользовательских секретов. Пожалуйста, дайте мне знать, что мне не хватает.
Порядок добавления источников конфигурации в ConfigurationBuilder
является критическим - те, которые добавляются позже, переопределяют те, которые были добавлены первыми. В вашем примере вы вызываете AddUserSecrets
перед AddJsonFile
, в результате чего значения вашего файла JSON переопределяют значения, определенные в ваших пользовательских секретах.
Для полноты здесь фиксированная версия:
var configurationBuilder = new ConfigurationBuilder()
.AddEnvironmentVariables();
configurationBuilder.SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
// configurationBuilder.AddUserSecrets<Program>(); -> This does not work either
configurationBuilder.AddUserSecrets(assembly, optional: false);
В свете этого вы также можете переместить вызов AddEnvironmentVariables
чтобы он выполнялся позже в настройке конфигурации.