扒一扒.NET Core的环境配置提供程序
前言
很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助。
目录
.NET Core中的配置
ASP.NET Core中的配置
扒一扒环境变量提供程序
为什么是“__”?
“__”如何变成了“:”?
数据库连接字符串的配置的特殊规则
最后
前言
.NET Core的配置提高程序非常强大和灵活,支持从各种配置源读取键值对:
· 命令行参数
· 目录文件(.json、xml、ini)
· 环境变量
· 内存中的对象
· Azure Key Vault
本篇我们侧重于扒一扒.NET Core的环境配置程序,了解其执行机制和特殊规则以及原理。因为通过环境变量来配置在很多场景都非常有用,尤其是在Docker环境之中。具体使用大家可以看看下面给出的截图和配置示例。
.NET Core中的配置
在.NET Core中,我们通常这么玩:
1. 添加依赖:
<PackageReferenceInclude="Microsoft.Extensions.Configuration"Version="2.2.0" />
<PackageReferenceInclude="Microsoft.Extensions.Configuration.CommandLine"Version="2.2.0" />
<PackageReferenceInclude="Microsoft.Extensions.Configuration.EnvironmentVariables"Version="2.2.0" />
2. 添加配置代码
privatestaticvoid Main(string[] args)
{
var config = newConfigurationBuilder()
//支持命令行参数
.AddCommandLine(args)
//支持环境变量
.AddEnvironmentVariables()
.Build();
}
ASP.NET Core中的配置
因为在ASP.NET Core中,包“Microsoft.AspNetCore.App”已经包含了对“Microsoft.Extensions.Configuration”等包的依赖,因此在ASP.NET Core的应用程序中,通常我们会用以下代码来启用配置提供程序:
有时候我们也会使用下面代码来自定义配置:
对于第一种写法,我们可以通过查看源码了解其具体机制:
扒一扒环境变量提供程序
接下来我们重点扒一扒环境变量提供程序,环境变量提供程序在容器这块应用极广,也极为方便,比如设置日志的输出级别:
docker run --nameaspnetcore_sample --rm -it -p 8000:80 -e 'Logging__LogLevel__Default=Debug' microsoft/dotnet-samples:aspnetapp
docker run --nameaspnetcore_sample1 --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp
通过上面的对比,我们可以第一个命令通过设置了环境变量“Logging__LogLevel__Default=Debug”输出了调试日志。而且从上面代码来看,环境变量的配置会覆盖文件配置:
那么“Logging__LogLevel__Default”对应什么样的文件配置呢?如下所示:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
如上所示,这个配置我们在appsettings.json中能够找到。不过很奇怪的是,为什么通过环境变量配置会变成“Logging__LogLevel__Default"呢(注意中间是两个下划线)?
为什么是“__”?
我们继续来扒一扒。继续看源码:
首先我们查看AddEnvironmentVariables的代码:
顺藤摸瓜找到了
EnvironmentVariablesConfigurationSource:
最终扒开了EnvironmentVariablesConfigurationProvider的代码,找到了关键:
我们来挨个解析下重点。
“__”如何变成了“:”?
这个“__”在我们使用的时候,怎么变成“:”的呢?比如我们使用的时候都是这么玩的:
appConfiguration["RedisCache:ConnectionString"]
关键代码如下所示:
private static stringNormalizeKey(string key)
{
return key.Replace("__",ConfigurationPath.KeyDelimiter);
}
数据库连接字符串的配置的特殊规则
在上图我们看到了一些特殊的判断,也就是扒出了数据库连接字符串的几个特殊名称前缀,这是怎么回事呢?这里我们补充说明一下:
针对连接字符串,.NET Core提供了一些特殊的处理规则。主要支持以下数据库:
连接字符串前缀 |
提供程序 |
CUSTOMCONNSTR_ |
自定义提供程序 |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL 数据库 |
SQLCONNSTR_ |
SQL Server |
当发现有以上前缀的环境变量时,会进行一些特殊处理:根据前缀在ConnectionStrings节添加对应的键值对,并且添加数据库提供程序的配置,如下所示:
环境变量键 |
转换的配置键 |
提供程序配置条目 |
CUSTOMCONNSTR_<KEY> |
ConnectionStrings:<KEY> |
配置条目未创建。 |
MYSQLCONNSTR_<KEY> |
ConnectionStrings:<KEY> |
键: ConnectionStrings:<KEY>_ProviderName: |
SQLAZURECONNSTR_<KEY> |
ConnectionStrings:<KEY> |
键: ConnectionStrings:<KEY>_ProviderName: |
SQLCONNSTR_<KEY> |
ConnectionStrings:<KEY> |
键: ConnectionStrings:<KEY>_ProviderName: |
如果说了这么多你还不太明白,简单的来讲,对于常用的数据库连接字符串,.NET环境变量提供程序提供了内置的简写进行配置,比如在Docker参数中我们可以这么配置:
-e ‘SQLCONNSTR_Default=Server= 192.168.1.11;Database=test; User ID=dev;Password=dev;’
如上所示,其中Default对应配置文件的示例如下图所示:
这样说是否明白了呢?如上所示,主要支持MySQL、Azure SQL 数据库和SQL Server。
最后
我们再来看看环境变量最终是如何变成配置路径,如以下代码:
至此,整个环境变量提供程序均已扒完,这次就说到这里。
.NET Core的配置非常灵活和强大,想了解更多,大家可以直接通过官网学习:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2#environment-variables-configuration-provider
只是结合代码,能够更易于我们理解以及使用。
转载是一种动力 分享是一种美德
如果喜欢作者的文章,请关注“magiccodes”订阅号以便第一时间获得最新内容。本文版权归作者和湖南心莱信息科技有限公司共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
QQ群:
编程交流群<85318032>
产品交流群<897857351>
长沙线下技术社区已经创建,有兴趣者可以通过客服加群。接下来,我们会定期组织一些线下技术交流分享会,以飨大家。
扒一扒.NET Core的环境配置提供程序相关推荐
- ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础 ...
- ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Windows 环境配置 ASP.NET Core ...
- .NET Core开发实战(第10课:环境变量配置提供程序)--学习笔记
10 | 环境变量配置提供程序:容器环境下配置注入的最佳途径 环境变量的配置提供程序主要适应场景: 1.在 Docker 中运行时 2.在 Kubernetes 中运行时 3.需要设置 ASP.NET ...
- ASP.NET Core 配置 - 创建自定义配置提供程序
ASP.NET Core 配置 - 创建自定义配置提供程序 在本文中,我们将创建一个自定义配置提供程序,从数据库读取我们的配置.我们已经了解了默认配置提供程序的工作方式,现在我们将实现我们自己的自定义 ...
- .NET Core开发实战(第9课:命令行配置提供程序)--学习笔记
09 | 命令行配置提供程序:最简单快捷的配置注入方法 这一节讲解如何使用命令行参数来作为配置数据源 命令行配置(提供程序的)支持三种格式的命令 1.无前缀的 key=value 模式 2.双中横线模 ...
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...
- vs+opencv环境配置出现程序无法启动及提示无法打开opencv_world400d.lib问题的解决方法
@vs+opencv 1配置完成但是频频出错 1问题描述:无法启动程序,系统找不到指定的文件. 我的原图忘记保存,故找了一张类似问题的图片做代替描述问题.在出现上述问题之后,点击确定后,程序报错,错误 ...
- .Net core下的配置设置(一)——Configuration
ASP.NET Core 中提供了一个Configuration 包,用以应用配置基于配置提供程序建立的键值对.这里以json文件配置的方式,简单的介绍一下它的用法. 首先定义一个配置文件appset ...
- 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...
最新文章
- GNU make manual 翻译(八十八)
- layui数据表格自定义复选框表头_解决LayUI数据表格复选框不居中显示的问题
- Vue iView Admin 动态路由菜单加载 前后端分离(springboot 2.x iview admin vue 前后端分离 模型设计器 动态数据权限...
- 在cmd中使用指令来执行jar包
- 老师“鬼话”全曝光!哈哈哈哈哈哈全国的老师都这样吗?
- java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement
- 服务器不稳定 如何让百度重新收录网站,教你如何让百度重新收录首页
- 爆料图显示iPhone 14 Pro及Max机身更厚 摄像头凸起也更多
- 大数据分析需要掌握哪些技术
- 高性能tornado框架简单实现restful接口及运维开发实例
- 应用机器学习(八):线性模型
- 蓝桥杯——2015年C++A组第3题:奇妙的数字【枚举】
- 计算经纬度距离工具类
- XML Essential Training XML基本培训 Lynda课程中文字幕
- 2116: 简简单单的数学题(快速幂||爆longlong处理)
- Flink在流处理上的Source和sink操作、Flink--sink到kafka
- 俞敏洪沉默,新东方落泪
- Ant 下载安装配置使用教程
- dingo php,Laravel Dingo API
- php 分数相同怎么排名,怎么算出成绩排名_学校班级成绩排名计算方法
热门文章
- 一个countDown在多线程调度下使用不当的分享
- 光纤熔接过程详细说明
- mysql-普通查询(General Query)慢查询(Slow Query)相关日志配置
- php如何读出xml的节点内容 两个例子
- Linux下查看进程对应的命令绝对路径
- MariaDB 10的复制 集群 高可用搭建 大表拆分【持续更新中】
- CvBlobDetector 新目标检测算法简析
- .NET6使用DOCFX根据注释自动生成开发文档
- .NET 6 Talk Party 2|.NET Core 与行业
- .NET上海社区线下Meetup - 5.22 Blazor Day