簡體   English   中英

為什么我的 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 類的變量。

    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可能超出了范圍。 我並不困惑為什么在我們部署它時它不起作用,但我對它為什么在本地工作感到困惑。 無論哪種方式,上述修復都適用於兩者,因此問題已解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM