为什么我的 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
可能超出了范围。我不明白为什么在我们部署它时它不起作用,但我 不明白为什么它在本地起作用。无论哪种方式,上面的修复都适用于两者,因此问题已解决。
我们在 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
可能超出了范围。我不明白为什么在我们部署它时它不起作用,但我 不明白为什么它在本地起作用。无论哪种方式,上面的修复都适用于两者,因此问题已解决。