为什么ASP.NET Core 数据库连接串的值和appsettings.json配的不一样?

2022-04-17 02:10:06
目录
一、配置读取顺序二、分析三、演示1.读取Providers2.读取配置值

一、配置读取顺序

ASP.NET Core 中的配置是使用一个或多个配置提供程序执行的,配置提供程序使用各种配置源从键值对读取配置数据。

ASP.NET Core 提供了大量可用的配置提供程序,这还不包括可以自定义配置提供程序。

添加配置提供程序的顺序很重要,因为后面的提供程序添加的配置值将覆盖前面的提供程序添加的值。

配置提供程序的典型顺序为:

appsettings.jsonappsettings.Environment.json用户机密环境变量命令行参数

假如,appsettings.json配置了开发环境的数据库连接串,appsettings.Production.json配置了生产环境的数据库连接串;管理员密码仅配置在用户机密中。

最终生产环境的配置为:

来源
数据库连接串appsettings.Production.json
管理员密码用户机密

二、分析

IConfigurationRoot 接口的文档上,可以了解到,IConfigurawww.easck.comtionRoot是表示 IConfiguration 层次结构的根。

使用IConfigurationRoot.Providers可以得到IEnumerable,猜测应该是顺序排列的。

然后反向遍历Providers,读取配置key对应的值,如果存在那应该就是配置的来源了。

让我们验证一下。

三、演示

1.读取Providers

创建WebApplication1,修改Startup.cs,代码如下:

public Startup(IConfiguration configuration){  Configuration = (IConfigurationRoot)configuration;}public IConfigurationRoot Configuration { get; }public void Configure(IApplicationBuilder app, IWebHostEnvironment env){  ......  app.UseEndpoints(endpoints =>  {      endpoints.MapGet("/test", async context =>      {        foreach(var provider in Configuration.Providers)        {          await context.Response.WriteAsync(provider.ToString());          await context.Response.WriteAsync("rn");        }      });  });   ......}

从下图看到,顺序应该是正确的:

为什么ASP.NET Core 数据库连接串的值和appsettings.json配的不一样?

2.读取配置值

继续修改Startup.cs,代码如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){  ......  app.UseEndpoints(endpoints =&g          await context.Response.WriteAsync(provider.ToString());          await context.Response.WriteAsync("rn");          await context.Response.WriteAsync(value);          break;        }      }    });  });   ......}

运行后查找AllowedHosts配置,返回结果正确。

为什么ASP.NET Core 数据库连接串的值和appsettings.json配的不一样?

再次查找AllowedHosts配置,返回结果正确。

为什么ASP.NET Core 数据库连接串的值和appsettings.json配的不一样?