首页 > 解决方案 > 部署时 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,因此必须找到它。

标签: azureazure-functions

解决方案


我通过替换得到了部分解决方案

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 变量。


推荐阅读