很久之前,在玩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. Java开源生鲜电商平台-订单表的设计(源码可下载)

    Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...

  2. Python 装饰器(Decorator)

    装饰器的语法为 @dec_name ,置于函数定义之前.如: import atexit @atexit.register def goodbye(): print('Goodbye!') print ...

  3. .NET之IOC控制反转运用

    当前场景: 如果有不同的用户.使用同一个系统.而不同的客户有某些不同的需求.在不改变系统主体的情况下,可以直接使用IOC控制反转依赖搭建项目 1.添加接口层 目前里面只有一个会员的类.里面有一个登录接 ...

  4. MongoDb进阶实践之七 MongoDB的索引入门

    一.引言     好久没有写东西了,MongoDB系列的文章也丢下好长时间了.今天终于有时间了,就写了一篇有关索引的文章.一说到"索引",用过关系型数据库的人都应该知道它是一个什么 ...

  5. 微信小程序函数调用监控

    微信小程序之无埋点函数调用监控 有时候,面对一个bug,左思右想就是无法理解为什么. 我就有过这样的经历,耗时整个一个晚上,后来还是放弃了.不得不在所有可能的点都加上日志,部署等待再次报错,真的很让人 ...

  6. 深入浅出 TCP/IP 协议

    TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输.TCP/IP 协议采用4层结构,分别是应用层.传输层.网络层和链路 ...

  7. 6个常见的php安全攻击

    1.SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行.还有一种是通过system()或exec()命令注入的,它具有相同的SQL注入机制,但只针对sh ...

  8. struct和union的区别

    1)union是几个不同类型的变量共占一段内存(相互覆盖):struct是把不同类型的数据组合成一个整体 2)对齐方式略有区别:union不需要+,只需要拿出对齐后的最长 structure unio ...

  9. Spring加载xml配置文件的方式 ApplicationContext

    大家都知道Java读普通文件是通过Basic I/O 中的InputStream.OutStream.Reader.Writer 等实现的.在spring 框架中,它是怎样识别xml这个配置文件的呢? ...

  10. Linux ftrace框架介绍及运用

    目录: 1. ftrace背景 2. 框架介绍 3. 主要代码分析 4. ftrace的配置和使用 5. ftrace相关工具 在日常工作中,经常会需要对内核进行Debug.或者进行优化工作.一些简单 ...