azure - 部署时 Azure 函数未绑定到 appsettings
问题描述
我有一个使用 Visual Studio 使用 3.0.9 版 Functions SDK 用 C# 编写的 Azure Function 应用程序。在与 csproj 文件和 host.json 相同的目录中,我有一个 appsettings.json 文件,其内容如下:
{
"test-queue": "test,
"myOptions": {
"batchSize": 5000
}
}
当我在本地运行该函数时,它运行良好,但由于某种原因,当它部署到 Azure 时,它似乎没有绑定到 appsettings 文件。我使用以下启动类:
public class Startup : FunctionsStartup
{
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
builder.ConfigurationBuilder
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
var builtConfig = builder.ConfigurationBuilder.Build();
var keyVaultName = builtConfig["AzureKeyVaultName"];
if (!string.IsNullOrEmpty(keyVaultName))
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
builder.ConfigurationBuilder.AddAzureKeyVault($"https://{keyVaultName}.vault.azure.net/");
}
builder.ConfigurationBuilder
.AddJsonFile("local.settings.json", true)
.AddEnvironmentVariables()
.Build();
}
public override void Configure(IFunctionsHostBuilder builder)
{
FunctionsHostBuilderContext context = builder.GetContext();
builder.Services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.GetSection("myOptions").Bind(settings);
});
}
}
我有一个这样的函数类:
public class MyFunction
{
private readonly MyOptions options;
public MyFunction(IOptions<MyOptions> options)
{
this.options = options.Value;
}
[FunctionName("Test")]
public async Task Run(
[QueueTrigger("%test-queue%")] MyParameters parameters,
ILogger log)
{
log.LogInformation($"Batch size: {options.BatchSize}");
}
}
问题是,该功能似乎没有使用 appsettings 文件。我在启动时收到一个 InvalidOperationException 说 '%test-queue%' 没有解析为一个值。”我可以摆脱队列绑定并硬编码队列名称。这使得函数运行正常,但随后日志文件显示批量大小为 0 而不是 5000。
同样,它在本地运行时有效,但在部署时无效。在启动中注册 appsettings 文件时,该optional
标志为 false,因此必须找到它。
解决方案
我通过替换得到了部分解决方案
builder.ConfigurationBuilder
.SetBasePath(Environment.CurrentDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
和
FunctionsHostBuilderContext context = builder.GetContext();
builder.ConfigurationBuilder
.AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: false, reloadOnChange: false)
.AddEnvironmentVariables();
它仍然让我对队列名称进行硬编码,但至少设置了 batchSize 变量。
推荐阅读
- python - Python:两个对象似乎引用同一个变量,即使它们之间没有任何明确的联系
- command-line - 有没有办法编辑在 Octave CLI 中键入的最后一个 Octave 命令和/或脚本
- javascript - 从多级嵌套数组 JavaScript 中获取所有键值
- c# - 等待内部实体框架上下文和外部有什么区别?
- xamarin - Xamarin 数据绑定到当前属性
- c# - 注销后,用户可以通过单击返回按钮返回页面
- ignite - 在慢速网络上从 Ignite 缓存中读取所有键值对需要很长时间
- python - 在 .json 文件中将圆转换为多边形
- java - Java EE7 回滚事务
- java - 提取特定规则或标记之前的隐藏评论内容(Antlr、Java)