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 class 的样子。
[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 class如下
public class MyOptions
{
public string MyCustomSetting { get; set; }
}
我的主要 class 包含 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 的块?我做错了什么吗?
通过换掉
让它工作
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"));
我不知道为什么这行得通,而教程中描述的方法却行不通。但这已经解决了我的问题,所以我将问题标记为已回答。
在处理创建 Azure 函数应用程序方面,我是一名新开发人员。由于我们有不同的部署环境,我们使用基于环境的 appsettings.json 文件从 Azure Key Vault 加载正确的值。我按照这里的教程进行操作:https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection 添加 appsettings.json 文件。这是我的 Startup class 的样子。
[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 class如下
public class MyOptions
{
public string MyCustomSetting { get; set; }
}
我的主要 class 包含 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 的块?我做错了什么吗?
通过换掉
让它工作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"));
我不知道为什么这行得通,而教程中描述的方法却行不通。但这已经解决了我的问题,所以我将问题标记为已回答。