Я пытаюсь следовать указаниям, которые позволят azure функциям (v2) использовать файлы настроек приложения json файлов для каждой среды (dev, test, stage, prod).
Approach 1 - Использование ExecutionContext На основании этой статьи я попытался выполнить следующий код. Настройки никогда не возвращаются из local.settings. json, который включен в опубликованный код.
[FunctionName("ScheduleApp")]
public async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
{
log.LogInformation($"ScheduleApp triggered...");
try
{
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(context.FunctionAppDirectory)
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var y = configurationBuilder.GetConnectionStringOrSetting("somesetting");
var x = configurationBuilder["test"];
log.LogInformation($"x = {x}, y = {y});
}
catch (Exception ex)
{
log.LogInformation($"exception = {ex.Message}");
}
Подход 2. Использование startup.cs ConfigurationBuilder
FunctionOptions.cs - это написанный мной класс, представляющий собой набор свойств, соответствующих конфигурации в local.settings. json file Коллекция значений. IOptionsMonitor этого класса передается в конструкторе функции azure, показанной ниже. значения из файла json также не возвращаются в этом подходе.
Startup.cs ....
public override void Configure(IFunctionsHostBuilder builder)
{
var configurationBuilder = new ConfigurationBuilder();
var descriptor = builder.Services.FirstOrDefault(d => d.ServiceType == typeof(IConfiguration));
if (descriptor?.ImplementationInstance is IConfigurationRoot configuration)
{
configurationBuilder.AddConfiguration(configuration);
}
Configuration = configurationBuilder.Build();
builder.Services.AddOptions<FunctionOptions>();
builder.Services.Configure<FunctionOptions>(Configuration);
builder.Services.Configure<FunctionOptions>(Configuration.GetSection("Values"));
}
ScheduleApp.cs ....
public ScheduleApp(IConfiguration configuration, IOptionsMonitor<FunctionOptions> optionsAccessor)
{
_functionOptions = optionsAccessor.CurrentValue;
_configuration = configuration;
}
[FunctionName("ScheduleApp")]
public async Task Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
{
log.LogInformation($"ScheduleApp triggered...");
try
{
var z = "";
if (_functionOptions != null)
z = _functionOptions.somesetting;
else
log.LogInformation("_funcionsOption is null");
log.LogInformation($"_funcionsOption = {z}");
}
catch (Exception ex)
{
log.LogInformation($"_funcionsOption exception, ex={ex.Message}");
}
Ни один из этих подходов не дает значений конфигурации. Я попытался добавить файлы. json в качестве содержимого в функцию azure. Я поиграл с переменной окружения AZURE_FUNCTIONS_ENVIRONMENT, так как ожидал, что это будет контролировать, какой набор настроек использовался (средой). Ничего не работает.
Я что-то упускаю. Может кто-то указать на то, что мне не хватает или на рабочий c# образец того или иного подхода? В идеале было бы также показано, как управлять каждым параметром среды, как в
- appsettings.dev. json
- appsettings.test. json
- appsettings. stage. json
- appsettings.prod. json