繁体   English   中英

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

[英]appsettings.json values not binding in Azure Functions App V3

在处理创建 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 Timer 函数的主类如下

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 变量也正确返回“build”。 我已经检查以确保两个 appsettings.json 文件都是“如果较新则复制”,当将鼠标悬停在“配置”方法中的“配置”变量上时,我看到我的 appsettings.build.json 文件在那里。 如何让函数应用程序从 appsettings.build.json 而不是 local.settings.json 绑定块? 我做错了什么吗?

通过换出它来工作

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"));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM