.NET Core - 能够连接到 Azure App Config 但不能返回任何配置值?

Posted

技术标签:

【中文标题】.NET Core - 能够连接到 Azure App Config 但不能返回任何配置值?【英文标题】:.NET Core - Able to connect to Azure App Config but can't return any config values? 【发布时间】:2021-09-02 11:37:36 【问题描述】:

我有一个 .NET Core Azure Function 应用程序,我在其中连接到 Azure App Config 服务并注册 Key Vault 连接:

using Azure.Identity;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using System;

[assembly: FunctionsStartup(typeof(Func.Accounts.Api.Startup))]

namespace Func.Accounts.Api

    public class Startup : FunctionsStartup
    
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        
            string connectionString = Environment.GetEnvironmentVariable("AppConfigConnectionString");

            builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
            
                options.Connect(connectionString)
                    .ConfigureKeyVault(kv =>
                    
                        kv.SetCredential(new DefaultAzureCredential());
                    );
            );
        

        public override void Configure(IFunctionsHostBuilder builder)
        
        
    

我可以很好地连接到服务,并且我可以通过 Azure 门户看到它正在接收请求,但是我无法让它实际返回任何配置值。这是配置注入函数后的样子:

我知道 App Config Service 中有 3 个配置值,但它不返回任何数据,而且我看不到它失败的地方。据我所知,不存在身份验证问题,并且我在另一个项目中使用相同的方法成功实现了这一点。

有趣的是,如果我尝试通过 Azure App Configuration client library 检索密钥,我会在 GetConfigurationSetting 方法上收到以下 404 错误。我很难理解它是如何看不到我的任何配置设置的。

【问题讨论】:

虽然调试是 connectionString 实际上是从环境变量中正确填充的? @Nkosi 是的。如果这是过去的问题,则会引发身份验证错误。正如我所说,我可以看到来自 Azure 门户的请求,屏幕截图中显示的 AppConfigurationEndpoint 是从连接字符串中获取的正确 URI。 请发布您的代码。 有几点需要注意:Azure App Config 能否访问 Key Vault(您需要对此进行配置)?你的配置值有标签吗? @lopezbertoni 从文档中我的印象是,Azure App Config 不能/不能直接访问密钥保管库,并且它是需要对其进行身份验证的消费应用程序。就标签而言 - 是的,它们确实有标签,这会影响您调用服务的方式吗? 【参考方案1】:

从 cmets 看来,您需要做两件事:

    如果您使用标签,则需要在配置应用程序时为其添加过滤器。 如果您使用的是 Azure Key Vault,请确保 grant access to your App Configuration

这是一个使用标签加载配置的示例。

[assembly: FunctionsStartup(typeof(Host.Example.Startup))]

namespace Host.Example

    public partial class Startup : FunctionsStartup
    
        public IConfiguration Configuration  get; set;  

        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        
            var config = builder.ConfigurationBuilder.Build();

            var appConfigConnection = config.GetConnectionString("AppConfig");
            // Here the label is the environment name
            var environment = Environment.GetEnvironmentVariable("Environment");

            builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
            
                // Load the configuration using labels
                // Connect it to the Key Vault. Didn't test the Key Vault code but it should work if configured properly
                options.Connect(appConfigConnection)
                    .Select(KeyFilter.Any, environment.ToLowerInvariant())
                    .ConfigureKeyVault(kv =>
                    
                        kv.SetCredential(new DefaultAzureCredential());
                    );
            );
        

        public override void Configure(IFunctionsHostBuilder builder)
        
            Configuration = builder.GetContext().Configuration;
        
    

【讨论】:

以上是关于.NET Core - 能够连接到 Azure App Config 但不能返回任何配置值?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 上的 .NET Core 无法连接到 SQL Server 数据库

将 .NET Core 桌面应用程序连接到 Azure SQL Server 的最佳方式是啥

Node 在连接到 Postgres 方面比 .NET Core 快 20 倍

通过 Proxy .net core 连接 Azure 存储

如何将.net控制台应用程序客户端连接到Azure数据工厂

ASP.NET Core 2.2 中的 Azure AD 身份验证