0

我正在使用作为 Azure 应用服务部署的 Asp.NET Core 5 (v5.0.6) Web API,并且我正在从使用 API 中的 appsettings.json 迁移到与 Azure 应用配置服务集成。我已经设置了 Azure 应用程序配置服务,但我遇到的问题是如何访问我的 Azure 应用程序配置服务中的值,以便在我仍在 Program.cs 时检索用于数据库访问的连接字符串。

请注意,在 CreateHostBuilder() 方法中,我正在检查 context.HostingEnvironment.IsDevelopment() 环境变量,如果它是“IsDevelopment”,暗示本地 DEV,我正在通过用户机密读取 Azure 应用程序配置服务连接字符串,但如果它不是本地 DEV,而不是我依赖托管标识并仅从 appsettings.json 传入端点值。

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

我要解决的问题是如何访问 Azure App Configuration Service 中的值,同时仍在 Program.cs 中,以检索连接字符串以访问我用于记录的 Azure SQL 数据库。

在下面的代码中,当我在 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>();
            });

}
4

1 回答 1

1

尝试下面的代码来获取配置值:

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]);
        }
    }
}

结果 :

在此处输入图像描述 在此处输入图像描述

于 2021-06-22T04:34:19.930 回答