【问题标题】:Azure app config does not get updated when azure function is running运行 azure 函数时,Azure 应用程序配置未更新
【发布时间】:2020-11-03 08:45:18
【问题描述】:

我正在使用 azure 应用配置和 azure 功能。

所以我从 azure 应用配置中提取所有关键值。但是,如果 azure 函数正在运行,并且如果我从 azure 应用程序配置中对键值进行任何更改,则 azure func 将不会显示更新后的值。

下面是我实现的代码

在startup.cs中

public override void Configure(IFunctionsHostBuilder builder)
        {
            var environmentName = Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT");
            if (string.IsNullOrWhiteSpace(environmentName))
                throw new Exception("AZURE_FUNCTIONS_ENVIRONMENT could not be resolved.");

            var hostEnvironment = new HostEnvironment { EnvironmentName = environmentName };
            var config = SetUpConfiguration(builder.Services, hostEnvironment);

            var appSettings = config.Get<TSettings>();
            appSettings.AppName = _appName;

            builder.Services.AddSingleton<ICorrelationIdProvider>(new FunctionAppCorrelationIdProvider());
            builder.Services.AddSingleton<IIdentityProvider>(new FunctionAppIdentityProvider(appSettings.AppName));
            builder.Services.AddSingleton<IHostEnvironment>(hostEnvironment);
            builder.Services.AddSingleton(appSettings);

}

    private IConfiguration SetUpConfiguration(IServiceCollection services, IHostEnvironment environment)
            {
                var executionContextOptions = services.BuildServiceProvider().GetService<IOptions<ExecutionContextOptions>>().Value;
                var configBuilder = new ConfigurationBuilder().Initialize(environment, executionContextOptions.AppDirectory);
                var config = configBuilder.Build();
                services.AddSingleton<IConfiguration>(new ConfigurationRoot(config.Providers.ToArray()));
                return config;
            }

在一个辅助类中我写了下面的代码

 builder.AddAzureAppConfiguration(appConfigurationOptions =>
            appConfigurationOptions
                .Connect(new Uri(config["AppConfig:Endpoint"]), tokenCredential)
                .Select(ConfigurationKeys.AZURE_FUNC_TEST)
                .Select(KeyFilter.Any, environment.EnvironmentName)
                .ConfigureRefresh(refreshOptions =>
                {                 
                    refreshOptions.Register(ConfigurationKeys.AZURE_FUNC_TEST, false);
                    refreshOptions.SetCacheExpiration(TimeSpan.FromMinutes(1));
                })
                
        );
        return builder;

在 azure 函数中,我使用下面的代码来获取值

var test = _settings.AzureFuncTest;

但在我不重新启动 azure 函数之前,我不会得到新值。

【问题讨论】:

  • @JasonPan 我同意,但我希望它用于 azure 功能。在 azure 函数中我如何刷新它
  • @JasonPan 我正在获取 configurationRefresher = options.GetRefresher();为空

标签: c# azure-functions azure-app-configuration


【解决方案1】:

我已更新问题中的SetUpConfiguration 方法,以将代码包含在设置应用程序配置的辅助方法中。虽然问题不包括如何使用 helper 方法,但下面的代码将确保 configurationRefresher 被初始化。

private IConfiguration SetUpConfiguration(IServiceCollection services, IHostEnvironment environment)
{
    var executionContextOptions = services.BuildServiceProvider().GetService<IOptions<ExecutionContextOptions>>().Value;
    var configBuilder = new ConfigurationBuilder().Initialize(environment, executionContextOptions.AppDirectory);
    IConfigurationRefresher configurationRefresher = null;
    TokenCredential tokenCredential = new DefaultAzureCredential();

    configBuilder.AddAzureAppConfiguration(appConfigurationOptions =>
    {
        var settings = configBuilder.Build();

        appConfigurationOptions
            .Connect(new Uri(settings["AppConfig:Endpoint"]), tokenCredential)
            .Select(ConfigurationKeys.AZURE_FUNC_TEST)
            .Select(KeyFilter.Any, environment.EnvironmentName)
            .ConfigureRefresh(refreshOptions =>
            {
                refreshOptions.Register(ConfigurationKeys.AZURE_FUNC_TEST, false);
                refreshOptions.SetCacheExpiration(TimeSpan.FromMinutes(1));
            });

        configurationRefresher = appConfigurationOptions.GetRefresher();
    });

    var configuration = configBuilder.Build();
    services.AddSingleton(configurationRefresher);
    services.AddSingleton<IConfiguration>(configuration);

    return configuration;
}

此外,var appSettings = config.Get&lt;TSettings&gt;() 语句将在此时创建设置的副本,并且预计不会反映 IConfiguration 实例中的更改。为了能够看到最新的设置,请按照here 的描述使用IOptionsMonitor&lt;T&gt;

【讨论】:

  • 我试过了,是的,我得到了配置刷新值,当我在函数应用程序中写入这一行时,等待 _configurationRefresher.TryRefreshAsync();当我检查时,我看到了新值,但配置仍然具有旧值并且没有更新
  • 您检查了哪个变量显示了新值?您希望旧值在哪里更新?
  • 等待_configurationRefresher.TryRefreshAsync();当我在这一行中检查 await _configurationRefresher 时,它会使用新值进行更新,但 var appSettings = _config.Get();在这个 _config 仍然具有旧值
  • @Ekta 如果你尝试了官方源代码仍然发现问题存在,建议提出支持票寻求官方帮助。
  • @Ekta 好的,看起来它解决了您的问题,即刷新为空。 _config.Get&lt;FunctionAppSettings&gt;() 不会反映更改,因为它会创建配置的副本。您可以使用 IOptionsMonitor&lt;FunctionAppSettings&gt;() 创建一个可以注入 DI 的实例,并在 IConfiguration 中反映更新。
猜你喜欢
  • 2021-02-01
  • 2022-11-02
  • 2019-10-06
  • 2023-02-24
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多