Попытка изменить класс конфигурации .NET 6 в .ConfigureServicesC#

Место общения программистов C#
Ответить
Anonymous
 Попытка изменить класс конфигурации .NET 6 в .ConfigureServices

Сообщение Anonymous »

Вот моя ситуация: моя команда разработчиков должна получить строки подключения и другие конфиденциальные значения, такие как пароли, из переменных среды машинного уровня на серверах Windows. У меня есть консольное приложение .NET 6, использующее универсальный хост, и в файле appsettings.json я храню имя переменной среды, для которой хочу получить значение, и у меня есть класс, который содержит имя переменной среды и фактическое значение. секретное значение, полученное из переменной среды.
Моя проблема в том, что после того, как я получу значение из переменной среды и сохраню его в TopSecretConfig.SecretValue, это значение будет доступно из IOptions на мой машина, независимо от того, работаю ли я в Visual Studio 2022 или запускаю приложение из командной строки. Однако, когда он развертывается в нашей среде контроля качества, при доступе к нему из IOptions его значение равно нулю.
Очевидно, что код работает (на моей машине), но является ли это правильным способом изменить объект конфигурации и привязать значения, чтобы они были правильно введены через IOptions позже?
Какие факторы среды могут помешать работе кода в другой среде? Переменные среды присутствуют в среде QA на уровне машины.
Приведенный ниже код не является моим реальным кодом, но очень близок к нему.
appsettings .json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"TopSecretConfig": {
"EnvironmentVariableName": "VARIABLE_NAME"
}
}

Класс для хранения значения конфигурации:
public class TopSecretConfig
{
public string EnvironmentVariableName { get; set; }
public string SecretValue { get; set; }
}

Общий фрагмент хоста для получения конфигурации:
using (var host = Host.CreateDefaultBuilder(args)
.ConfigureLogging((context, builder) =>
{
// logging config
})
.ConfigureAppConfiguration((context, appConfig) =>
{
appConfig.Sources.Clear();
appConfig.SetBasePath(context.HostingEnvironment.ContentRootPath);
appConfig.AddJsonFile("appSettings.json");
appConfig.AddEnvironmentVariables();
appConfig.AddEnvironmentVariables("DOTNET_");
appConfig.AddEnvironmentVariables("TOP_SECRET_");
})
.ConfigureServices((builder, services) =>
{
services.Configure(builder.Configuration.GetSection(nameof(TopSecretConfig)));

// --------- Is this allowed? -----------
services.Configure(config =>
{
config.SecretValue = builder.Configuration[config.EnvironmentVariableName];
});

services.AddSingleton
();
})
.Build())
{
await host.StartAsync();
var lifetime = host.Services.GetRequiredService();

var processor = host.Services.GetRequiredService();
await processor.ExecuteAsync();

lifetime.StopApplication();
await host.WaitForShutdownAsync();
}

Класс, использующий конфигурацию:
public class Processor
{
private readonly ILogger Logger;
private readonly TopSecretConfig SecretConfig;

public Processor(ILogger logger, IOptions secretConfig)
{
this.Logger = logger ?? throw new ArgumentNullException(nameof(logger));
this.SecretConfig = secretConfig?.Value ?? throw new ArgumentNullException(nameof(secretConfig));

// this.SecretConfig.SecretValue is null here.
}
}


Подробнее здесь: https://stackoverflow.com/questions/757 ... reservices
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»