博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
晕了!这个配置值从哪来的?
阅读量:4034 次
发布时间:2019-05-24

本文共 2219 字,大约阅读时间需要 7 分钟。

如果有同事问你,数据库连接串的值和appsettings.json配的不一样,从哪来的?你能回答的出来吗?

配置读取顺序

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

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

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

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

  • appsettings.json

  • appsettings.Environment.json

  • 用户机密

  • 环境变量

  • 命令行参数

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

最终生产环境的配置为:

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

分析

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

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

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

让我们验证一下。

Demo

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("\r\n");                }            });    });        ......}

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

2.读取配置值

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

public void Configure(IApplicationBuilder app, IWebHostEnvironment env){    ......    app.UseEndpoints(endpoints =>    {        endpoints.MapGet("/test2/{key:alpha}", async context =>        {            var key = context.Request.RouteValues["key"].ToString();            foreach (var provider in Configuration.Providers.Reverse())            {                if (provider.TryGet(key, out string value))                {                    await context.Response.WriteAsync(provider.ToString());                    await context.Response.WriteAsync("\r\n");                    await context.Response.WriteAsync(value);                    break;                }            }        });    });        ......}

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

修改环境变量后 

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

结论

现在,如果还有同事问你,数据库连接串的值和appsettings.json配的不一样,相信你可以回答的出来了吧!

欢迎关注我的个人公众号”My IO“

转载地址:http://rmydi.baihongyu.com/

你可能感兴趣的文章
Android2.1消息应用(Messaging)源码学习笔记
查看>>
Phone双模修改涉及文件列表
查看>>
android UI小知识点
查看>>
Android之TelephonyManager类的方法详解
查看>>
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>
苹果Swift编程语言入门教程【中文版】
查看>>
捕鱼忍者(ninja fishing)之游戏指南+游戏攻略+游戏体验
查看>>
iphone开发基础之objective-c学习
查看>>
iphone开发之SDK研究(待续)
查看>>
计算机网络复习要点
查看>>
Variable property attributes or Modifiers in iOS
查看>>
NSNotificationCenter 用法总结
查看>>
C primer plus 基础总结(一)
查看>>
剑指offer算法题分析与整理(一)
查看>>
剑指offer算法题分析与整理(三)
查看>>
Ubuntu 13.10使用fcitx输入法
查看>>