appsettings.json 值在 Azure Functions App V3 中未绑定

Posted

技术标签:

【中文标题】appsettings.json 值在 Azure Functions App V3 中未绑定【英文标题】:appsettings.json values not binding in Azure Functions App V3 【发布时间】:2021-11-11 21:31:33 【问题描述】:

在处理创建 Azure 函数应用程序方面,我是一名新开发人员。由于我们有不同的部署环境,我们使用基于环境的 appsettings.json 文件从 Azure Key Vault 加载正确的值。我在这里按照教程进行操作:https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection 用于添加 appsettings.json 文件。这是我的 Startup 类的样子。

[assembly: FunctionsStartup(typeof(Trialtimer.FunctionApp.Startup))]
namespace Trialtimer.FunctionApp

    public class Startup: FunctionsStartup
    
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        
            FunctionsHostBuilderContext context = builder.GetContext();
            var config = builder.ConfigurationBuilder
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
                .AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT").json"), optional: true, reloadOnChange: true)
                .AddEnvironmentVariables()
                .Build();
        

        public override void Configure(IFunctionsHostBuilder builder)
        
            builder.Services.AddOptions<MyOptions>().Configure<IConfiguration>((options, configuration) =>
            
                var section = configuration.GetSection("MyOptions");
                section.Bind(options);
            );
        
    

根据上面的教程,我的 appsettings.json 文件是空的,而我的 appsettings.build.json 文件有以下内容

"MyOptions": 
    "MyCustomSetting": "Foobar"
  

我的 MyOptions 类如下

public class MyOptions
    
        public string MyCustomSetting  get; set; 
    

包含 Azure 计时器功能的主要类如下

public class TestTimerFunction
    
        private readonly MyOptions _settings;

        public TestTimerFunction(IOptions<MyOptions> options)
        
            _settings = options.Value;
        

        [FunctionName("AzureTimerFunction")]
        public async Task Run([TimerTrigger("*/3 * * * * *")]TimerInfo myTimer, ILogger log)
        
            var option = _settings;
            log.LogInformation($"Renew function executed at: DateTime.Now successfully with option.MyCustomSetting");   
        
    

我遇到的问题是,当我运行应用程序时,“MyCustomSetting”变量为空。如果我将我的 appsettings.build.json 文件中的相同 json 块添加到 local.settings.json 文件中,看起来它被正确读取并且“MyCustomSetting”具有值“FooBar”。 ASPNETCORE_ENVIRONMENT 变量也正确返回“构建”。我已经检查以确保两个 appsettings.json 文件都是“如果较新则复制”并且当将鼠标悬停在“配置”方法中的“配置”变量上时,我看到我的 appsettings.build.json 文件在那里。如何使函数应用程序绑定来自 appsettings.build.json 而不是 local.settings.json 的块?我做错了什么吗?

【问题讨论】:

你为什么在AddEnvironmentVariables()后面加.Build()??你也用&lt;None Update="appsettings.json"&gt; &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt; &lt;/None&gt; &lt;None Update="appsettings"&gt; &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt; &lt;CopyToPublishDirectory&gt;Never&lt;/CopyToPublishDirectory&gt; &lt;/None&gt;更新了你的.csproj 这可能会帮助你***.com/questions/40768490/… @VenkataNBhupathi 已经这样做了,但我得到了它的工作,将在下面发布答案。另外,我根据您的建议删除了 Build()。 【参考方案1】:

通过换掉它来工作

builder.Services.AddOptions<MyOptions>().Configure<IConfiguration>((options, configuration) =>
            
                var section = configuration.GetSection("MyOptions");
                section.Bind(options);
            );

builder.Services.Configure<MyOptions>(builder.GetContext().Configuration.GetSection("MyOptions"));

我不知道为什么这行得通,而教程中描述的方式却没有。但这已经解决了我的问题,所以我将问题标记为已回答。

【讨论】:

以上是关于appsettings.json 值在 Azure Functions App V3 中未绑定的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions 不发布 appsettings.prod.json 文件

Azure DevOps 发布更改 appsettings.json 日志记录部分

将 appsettings.json 文件中的机密存储在 Azure Key Vault 上的 .Net 控制台应用程序中

如何在运行时在 Blazor WebAssembly 客户端应用程序中使用 Azure 应用设置作为 appsettings.json 配置?

带有ssl的appsettings.json中的ConnectionStrings?网络核心

.NET Core 应用程序中的 appsettings.json 与 appsettings.Environment.json