Azure Durable Function如何替换local.settings.json的AzureWebJobsStorage为Key Vault值
实现方案
你不需要修改local.settings.json的物理文件内容,只需要在Startup.cs中通过内存配置源覆盖AzureWebJobsStorage的配置值,再替换默认的配置注入即可,完整修改后的Startup代码如下:
public class Startup : FunctionsStartup { private const string localSettingsJson = "local.settings.json"; private IConfigurationBuilder GetConfiguration(FunctionsHostBuilderContext context) => new ConfigurationBuilder() .SetBasePath(context.ApplicationRootPath) .AddJsonFile(localSettingsJson, optional: true, reloadOnChange: true) .AddEnvironmentVariables(); public override void Configure(IFunctionsHostBuilder builder) { FunctionsHostBuilderContext context = builder.GetContext(); var configBuilder = GetConfiguration(context); DefaultAzureCredential credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = "61063c32-379d-4e9d-8977-4b826c2bc50a" }); SecretClient secretClient = new SecretClient(new Uri("https://storageaccount.vault.azure.net/"), credential); configBuilder.AddAzureKeyVault(secretClient, new KeyVaultSecretManager()); IConfigurationRoot config = configBuilder.Build(); var keyVaultConnectionStringValue = config["storageaccount-connectionstring"]; // 新增代码开始 // 构造内存配置源,覆盖AzureWebJobsStorage配置值 var overrideConfig = new Dictionary<string, string> { // 兼容两种配置键格式,适配不同版本Functions运行时的读取逻辑 ["AzureWebJobsStorage"] = keyVaultConnectionStringValue, ["Values:AzureWebJobsStorage"] = keyVaultConnectionStringValue }; // 合并原有配置和覆盖配置 config = new ConfigurationBuilder() .AddConfiguration(config) .AddInMemoryCollection(overrideConfig) .Build(); // 替换默认IConfiguration注入,让Functions运行时使用自定义配置 builder.Services.AddSingleton<IConfiguration>(config); // 新增代码结束 var services = builder.Services; services.ConfigureAutoMapper(); } }
原理说明
- Azure Functions运行时读取
AzureWebJobsStorage等配置项时,会优先读取DI容器中注入的IConfiguration实例 - 用内存配置源添加的配置优先级高于
local.settings.json等文件配置源,不需要修改物理文件也不需要依赖环境变量就能实现配置覆盖 - 本地开发时如果需要保留存储模拟器的配置,可加环境判断,仅在云端运行时执行配置覆盖逻辑即可
内容的提问来源于stack exchange,提问作者user2043071
相关产品推荐
相关产品推荐

