如何在 Program.cs 中检索 Azure 应用程序配置服务设置

How to retrieve Azure App Configuration Service settings while in Program.cs

我正在使用 Asp.NET Core 5 (v5.0.6) web API 部署为 Azure 应用服务,我正在从 API 中使用 appsettings.json 迁移与 Azure 应用程序配置服务集成。我设置了 Azure 应用程序配置服务,但我遇到的问题是如何在我仍在 Program.cs.

中时访问我的 Azure 应用程序配置服务中的值以检索用于数据库访问的连接字符串

请注意,在 CreateHostBuilder() 方法中,我正在检查 context.HostingEnvironment.IsDevelopment() 环境变量,如果它是“IsDevelopment”,暗示本地 DEV,我正在通过读取 Azure 应用程序配置服务连接字符串用户机密,但如果它不是本地开发人员,那么我依赖托管身份并只传入来自 appsettings.json.

的端点值

我想要获取但不在 Azure 应用程序配置服务中的唯一值是本地 DEV Azure 应用程序配置服务连接字符串(来自用户机密)和来自 Appsettings.json 的 Azure 应用程序配置服务端点。所有其他设置应来自 Azure 应用程序配置服务。

我要解决的问题是如何访问 Azure 应用程序配置服务中的值,同时仍在 Program.cs 中,以检索用于访问 Azure SQL 数据库的连接字符串我正在用于日志记录。

在下面的代码中,当我 link CreateHostBuilderMethod 中的 Azure 应用程序配置并调用构建时,我希望 Azure 应用程序配置服务中的值可以通过静态配置获得 属性 .但是,当我尝试检索连接字符串值时,它始终为空。

如何正确检索 Azure 应用程序配置服务中的属性值以在 Program.cs 中使用它们?

这是我的 Program.cs 文件;

public class Program
{
    public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .AddUserSecrets<Startup>()
        .Build();

    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args)
            .Build();
        
        var connectionString = Configuration["CoreApi:Settings:LoggingDb"]; //<-- This returns null
        const string tableName = "ApiLogs";

        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Information()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
            .Filter.ByExcluding(Matching.FromSource("Microsoft.EntityFrameworkCore.Query"))
            .WriteTo.MSSqlServer(
                connectionString: connectionString,
                sinkOptions: new MSSqlServerSinkOptions { TableName = tableName })
            .CreateLogger();

        // TODO Enable to debug any startup Serilog issues. Make sure to comment out for PROD
        // Serilog.Debugging.SelfLog.Enable(msg =>
        // {
        //    Debug.Print(msg);
        //    Debugger.Break();
        // });
        //var host = CreateHostBuilder(args)
        //    .Build();

        try
        {
            Log.Information("Starting ConfirmDelivery API");
            host.Run();
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "ConfirmDelivery API Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                var settings = config.Build();
                if (context.HostingEnvironment.IsDevelopment())
                {
                    var connectionString = settings.GetConnectionString("AzureAppConfiguration");
                    config.AddAzureAppConfiguration(connectionString);
                }
                else
                {
                    var endpoint = settings["AppConfigEndpoint"];
                    var credentials = new ManagedIdentityCredential();
                    config.AddAzureAppConfiguration(options =>
                    {
                        options.Connect(new Uri(endpoint), credentials);
                    });
                }
            }).ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

}

尝试以下代码获取配置值:

using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.AzureAppConfiguration;


namespace myapp
{
    class Program
    {
        static void Main(string[] args)
        {
            var configItemName = "";
            var appConfigConnectionString = "";
            var builder = new ConfigurationBuilder();
            builder.AddAzureAppConfiguration(appConfigConnectionString);

            var config = builder.Build();
            Console.WriteLine(config[configItemName]);
        }
    }
}

结果: