很久之前,在玩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:
 值:MySql.Data.MySqlClient

SQLAZURECONNSTR_<KEY>

ConnectionStrings:<KEY>

键:

ConnectionStrings:<KEY>_ProviderName:
 值:System.Data.SqlClient

SQLCONNSTR_<KEY>

ConnectionStrings:<KEY>

键:

ConnectionStrings:<KEY>_ProviderName:
 值:System.Data.SqlClient

如果说了这么多你还不太明白,简单的来讲,对于常用的数据库连接字符串,.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

只是结合代码,能够更易于我们理解以及使用。

扒一扒.NET Core的环境配置提供程序的更多相关文章

  1. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我 ...

  2. ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Windows 环境配置 ASP.NET Core ...

  3. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  4. ASP.NET Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程 (转载)

    阅读目录 在Asp.Net Core 中使用外部登陆(google.微博...) 中间件管道 The Authentication Middleware The Challenge 与认证中间件进行交 ...

  5. Net Core 使用外部登陆提供程序登陆的流程,以及身份认证的流程

    在Asp.Net Core 中使用外部登陆(google.微博...)   原文出自Rui Figueiredo的博文<External Login Providers in ASP.NET C ...

  6. ASP.NET Core Windows 环境配置

    ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 ASP.NET Core 中的一些新的概念和它们是如何帮助我们开发现代化的 Web 应用程序 尽管 ASP. ...

  7. [IOT] - Raspberry Pi 4 Model B 系统初始化,Docker CE + .Net Core 开发环境配置

    本教程为在 Docker 中配置 .Net Core,如果想在树莓派 Raspbian 系统中配置 .Net Core,请参考:[IOT] - 在树莓派的 Raspbian 系统中安装 .Net Co ...

  8. IT兄弟连 JavaWeb教程 Servlet定义以及环境配置 BS程序和CS程序

    随着网络技术的不断发展,单机的软件程序已难以满足网络计算机的需求.为此,各种各样的网络程序开发体系结构应运而生.其中,运用最多的网络应用程序开发体系结构可以分为两种,一种是基于客户端/服务器的C/S结 ...

  9. Jenkins环境配置(集成自动化程序)

    一.下载 直接到官网https://jenkins.io/download/  进行下载 二.安装 1.在浏览器地址栏输入:http://loclhost:8081 运行Jenkins,首次进入会提示 ...

随机推荐

  1. 40多行python代码开发一个区块链。

    40多行python代码开发一个区块链?可信吗?我们将通过Python 2动手开发实现一个迷你区块链来帮你真正理解区块链技术的核心原理.python开发区块链的源代码保存在Github. 尽管有人认为 ...

  2. 指针超强汇总(谨记优先级:() > [] > *)

    参考:http://blog.chinaunix.net/uid-20120277-id-5760985.html C语言所有复杂的指针声明,都是由各种声明嵌套构成的.如何解读复杂指针声明呢?右左法则 ...

  3. 关于bootstrap-datetimepicker 插件的配置参数详解

    本人在网上查找的,  觉得还不错,就抄过来了... 有错误大家一起讨论,谢谢... 原地址是:http://www.bootcss.com/p/bootstrap-datetimepicker/ 项目 ...

  4. java多线程及线程安全详解

    为什么要使用多线程: 单线程只能干一件事  而多线程可以同时干好多事(将任务放到线程里执行  效率高) 而所谓同时干并不是真正意义上的同时   只是(这里就叫CPU)cpu在每个线程中随机切换来执行 ...

  5. 那些年,我们追过的RPC

    1974年冬,互联网大师 Jon Postel发表了RFC674:“Procedure Call Protocol Documents,Version 2”,尝试定义一种在包含70个节点的网络中共享资 ...

  6. Windows Defender Service 是选择Windows 10系统的最大障碍!

    今天从早上开始,Windows Defender Service服务从CPU消耗资源30%一直上升到60%并且无法下降. 我一直使用的是Windows 10 Enterprise 2016长期服务支持 ...

  7. Spring Boot整合Quartz实现定时任务表配置

    最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...

  8. 写完批处理脚本,再写个Gradle脚本,解放双手

    前言 上一篇写个批处理来帮忙干活---遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们做一些简单的重复性工作,本篇继续来学习如何用 Gradle 写脚本,让它也来帮我们干活 Gradl ...

  9. 进击Node.js基础(二)promise

    一.Promise—Promise似乎是ES6中的规范 PROMISE的语言标准,PROMISE/A+规范,如何使用,在什么场景下使用 Promise时JS对异步操作场景提出的解决方案(回调,观察者模 ...

  10. 巩固java(四)----super和super()

    引言: 一个公司里有普通员工和经理,他们之间有很多共同点,但也有一些差异,比如薪水问题,普通员工只有普通工资,经理在完成绩效后有一定比例的奖金.这时我们可以定义两个类Employee和Manager, ...