簡體   English   中英

當 azure 函數運行時,Azure 應用程序配置不會更新

[英]Azure app config does not get updated when azure function is running

我正在使用 azure 應用程序配置和 azure 功能。

所以我從 azure 應用程序配置中提取所有關鍵值。 但是,如果 azure 函數正在運行,並且我對 azure 應用程序配置中的鍵值進行了任何更改,則 azure func 將不會顯示更新后的值。

下面是我已經實現的代碼

在啟動.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 函數。

我已更新問題中的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<TSettings>()將在那時創建設置的副本,並且不會反映IConfiguration實例中的更改。 為了能夠看到最新的設置,請使用IOptionsMonitor<T>的描述在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM