为什么我的 Azure Function 无法在 startup.cs 中正确加载我的环境变量?

Why would my Azure Function not load my environment variables correctly in startup.cs?

我们在 Windows 应用服务的 .NET 6.0 上有一个 C# 预编译的 v4 Azure 函数。我们在 Startup.cs 中有以下代码:

public override void Configure(IFunctionsHostBuilder builder)
{
    IConfiguration config = new ConfigurationBuilder()
        .AddJsonFile(Path.Combine(builder.GetContext().ApplicationRootPath, $"local.settings.json"), optional: true, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();

    builder.Services.AddSingleton(config);

    builder.Services.AddSingleton(s =>
    {
        var connectionString = config["Azure:CosmosDB:ConnectionString"];
        if (string.IsNullOrEmpty(connectionString)) throw new InvalidOperationException(
            "Please specify a valid CosmosDBConnection in the local.settings.json file or your Azure Functions Settings.");

        return new CosmosClientBuilder(connectionString)
           .Build();
    });
    
    // Additional services configuration
}

我们在 csproj 中有必要的包引用:

 <ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.20.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="6.0.1" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.0" />
 </ItemGroup>

这在 VS 2022 本地运行良好 运行 并从 local.settings.json 加载,但空连接字符串检查失败,在部署到云时抛出显示的 InvalidOperationException,尽管正确设置了环境变量:

我们在这里缺少什么?

我们的解决方法是覆盖 ConfigureAppConfiguration 以初始化 Config,并且(因为我们需要在启动时的其他地方访问它)将其设置为 Startup.cs [=21= 上的变量].

    public IConfiguration Config { get; private set; }

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton(s =>
        {
            var connectionString = Config["Azure:CosmosDB:ConnectionString"];
            if (string.IsNullOrEmpty(connectionString)) throw new InvalidOperationException(
                    "Please specify a valid CosmosDBConnection in the local.settings.json file or your Azure Functions Settings.");

            return new CosmosClientBuilder(connectionString)
                .Build();
        });

    // Etc.
    }

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder
            .AddJsonFile(Path.Combine(builder.GetContext().ApplicationRootPath, $"local.settings.json"), optional: true, reloadOnChange: true)
            .AddEnvironmentVariables();
        Config = builder.ConfigurationBuilder.Build();

    }

由于向 AddSingleton 传递了一个操作,并且在需要服务之前不会调用该操作,因此我们原始代码中的 config 可能超出了范围。我不明白为什么在我们部署它时它不起作用,但我 不明白为什么它在本地起作用。无论哪种方式,上面的修复都适用于两者,因此问题已解决。