我的 Azure 应用配置终结点有啥问题?

Posted

技术标签:

【中文标题】我的 Azure 应用配置终结点有啥问题?【英文标题】:What is wrong with my Azure App Configuration endpoint?我的 Azure 应用配置终结点有什么问题? 【发布时间】:2021-10-29 04:45:53 【问题描述】:

我已经使用微软教程构建了两个测试网络核心 mvc 测试应用程序。

    构建一个使用连接字符串来使用 Azure 应用配置的应用

    Quickstart: Create an ASP.NET Core app with Azure App Configuration

    构建使用托管标识的应用以使用 Azure 应用配置(我的应用 TestAppConfigMi)

    Use managed identities to access App Configuration

第一个测试使用连接字符串在本地运行。第二个错误表明 Azure 应用配置终结点或 clientid 为空。

两个应用的端点相同 clientid 可能不正确,但存在于第二个应用中

我没有太多经验。我的故障排除过程是:

TestAppConfigMi 项目在 Visual Studio 中本地构建 在 Azure 浏览器中使用 HTTP 500.30 启动

Azure 诊断

Application: w3wp.exe
CoreCLR Version: 5.0.921.35908
.NET Version: 5.0.9
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentNullException: Value cannot be null. (Parameter 'uriString')
at System.Uri..ctor(String uriString)
at TestAppConfigMi.Program.<>c__DisplayClass1_0.<CreateHostBuilder>b__2(AzureAppConfigurationOptions options) in D:\a\TestAppConfigMi\TestAppConfigMi\Program.cs:line 29
at Microsoft.Extensions.Configuration.AzureAppConfiguration.AzureAppConfigurationSource.<>c__DisplayClass3_0.<.ctor>b__0()
at Microsoft.Extensions.Configuration.AzureAppConfiguration.AzureAppConfigurationSource.Build(IConfigurationBuilder builder)
   at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
   at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at TestAppConfigMi.Program.Main(String[] args) in D:\a\TestAppConfigMi\TestAppConfigMi\Program.cs:line 17

在 Program.cs 中(第 29 行)

options.Connect(new Uri(settings["AppConfig:Endpoint"]), new ManagedIdentityCredential("26e962f7-1a26-4f11-84d4-3bfcdd9f7dcc"))

(第 17 行)

CreateHostBuilder(args).Build().Run();

在 Visual Studio AppConfig 中:appsettings.json 中的端点

"AppConfig": 
"Endpoint": "xxxx"

与第一个工作应用程序中的secrets.json相同

    
  "ConnectionStrings:AppConfig": "Endpoint=xxxxx"

安装了两个包: Azure.Identity 1.5.0 Microsoft.Azure.AppConfiguration.AspNetCore 4.5.0

调试引用是一个为空的标识符。无论我如何看待它,都有一个价值存在。所以我会期待一个“未找到”或“错误的凭据”类型的消息。不是应用程序失败。

【问题讨论】:

【参考方案1】:

读取堆栈跟踪:

Exception Info: System.ArgumentNullException: Value cannot be null. (Parameter 'uriString')

at System.Uri..ctor(String uriString) //<== BAM!

所以settings["AppConfig:Endpoint"] 必须返回 null:

options.Connect(new Uri(settings["AppConfig:Endpoint"]), 

解决这个问题,您就解决了您的(当前)问题。

要检查您的提供程序是否运行时,只需调试和检查settings,您将看到所有可用提供程序及其解析值的列表,我猜这是一个错字,或者它不存在。

【讨论】:

戴夫,除了@TheGeneral 所说的,请注意 ManagedIdentityCredential 在本地不起作用。希望我对类似问题的回答对您有所帮助。 ***.com/questions/61729522/… 感谢@TheGeneral 和王振兰的投入。【参考方案2】:

我通过以下更改解决了这个问题:

这里是微软教程代码Use managed identities to access App Configuration

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
        webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
        
            var settings = config.Build();
            config.AddAzureAppConfiguration(options =>
                options.Connect(new Uri(settings["AppConfig:Endpoint"]), new ManagedIdentityCredential()));
        )
        .UseStartup<Startup>());

这是本地运行的工作代码(VS Azure 服务身份验证和我拥有 Azure 应用配置服务的系统托管身份数据所有者和数据读取者角色)&已部署到 Azure(Azure 应用配置服务的应用服务系统托管身份数据所有者和数据读取者角色)

public static IHostBuilder CreateHostBuilder(string[] args) =>
 Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
        
            webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
            
                var settings = config.Build();
                var appConfigurationEndpoint = settings["AzureAppConfigurationEndpoint"];

                config.AddAzureAppConfiguration(options =>
                    
                        options.Connect(new Uri(appConfigurationEndpoint), new DefaultAzureCredential());
                    );

                webBuilder.UseStartup<Startup>();
            );
        );

appsettings.json 是:

    
  "Logging": 
    "LogLevel": 
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
        
    
  ,
  "AllowedHosts": "*",

  "AzureAppConfigurationEndpoint": "https://xxxxxxxxxxx.azconfig.io"

我还没有研究这些变化产生影响的原因。我应该!但实际上,这只是一个较大项目的一个小模块。但是我确实尝试了各种组合(尝试包含尽可能多的教程代码)

我认为问题是本地开发需要在云部署之前成功。因此,我们需要能够在两种环境中无缝运行的代码。所以使用DefaultAzureCredential() 而不是ManagedIdentityCredentials() 似乎更可取。

我注意到 Azure.Idntity 文档指出后者 ManagedIdentityCredentials()“尝试使用已分配给部署环境的托管标识进行身份验证”,但没有详细说明为什么前者 DefaultAzureCredential() 只是“旨在简化获取从 SDK 开始,以合理的默认行为处理常见场景”?

但是,在我看来,诸如本教程之类的基本教程应该优先考虑诸如“入门”和“简化”之类的术语。此外,不应低估查看代码在本地工作的重要性。

我欢迎任何人对这些更改提出 cmets。特别是每个示例中处理 Azure 应用程序配置端点的方式。

【讨论】:

以上是关于我的 Azure 应用配置终结点有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

我无法从我的 REACT 应用程序中读取 azure 应用程序服务配置中的环境变量

如何为 ASP.NET Core 应用配置 Azure 应用服务日志记录提供程序?

Azure SAML2登录系统问题

使用Azure Web作业配置应用程序洞察

如何在 Azure DevOps 中为 .net6 iOS 应用程序配置配置文件?

为 Azure 存储帐户创建专用终结点连接时出现 ResourceNotFound 错误