我使用微软教程构建了两个测试网核心mvc测试应用程序。
-
构建一个使用Azure应用配置连接字符串的应用
快速入门:创建一个ASP。. NET Core应用与Azure应用配置
-
构建一个使用托管身份来使用Azure应用配置的应用(我的应用TestAppConfigMi)
使用受管理的身份访问App Configuration
第一个测试使用连接字符串在本地运行。第二个有错误,表明Azure应用程序配置端点或客户端是空的。
- 两个应用的端点是相同的
- 客户端可能不正确,但存在于第二个应用
我没有多少经验。我的故障排除过程如下:
- 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:aTestAppConfigMiTestAppConfigMiProgram.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:aTestAppConfigMiTestAppConfigMiProgram.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:Endpoint In appsettings.json
"AppConfig": {
"Endpoint": "xxxx"
与secrets相同。Json在第一个工作应用
{
"ConnectionStrings:AppConfig": "Endpoint=xxxxx"
}
安装了两个包:Azure。身份1.5.0Microsoft.Azure.AppConfiguration.AspNetCore 4.5.0
调试引用是一个为空的标识符。不管我怎么看,它都有价值。所以我希望是"未找到"或者"证书错误";消息类型。而不是应用程序失败。
读取堆栈跟踪信息:
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
,您将看到所有可用的提供程序及其解析值的列表,我的猜测是它是一个打字错误,或者它不存在。
我使用以下更改修复了此问题:
下面是微软教程代码使用托管身份访问应用程序配置
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。身份文档声明后一个ManagedIdentityCredentials()
"尝试使用分配给部署环境的托管身份进行身份验证";但没有详细说明为什么前DefaultAzureCredential()
只是"旨在通过处理具有合理默认行为的常见场景来简化开始使用SDK"?
然而,在我看来,一个基础教程,比如这一个,应该考虑诸如"开始"之类的术语;,"simplification"优先考虑。此外,看到代码在本地工作的重要性也不应该被低估。
我欢迎任何人对这些变化发表意见。特别是在每个示例中处理Azure应用程序配置端点的方式。