首页 > 其他分享 >NET CORE Configuraion 使用详解 获取配置文件参数 读取环境变量、读取配置文件、读取Ini配置、读取Xml配置、多源配置读取顺序分析

NET CORE Configuraion 使用详解 获取配置文件参数 读取环境变量、读取配置文件、读取Ini配置、读取Xml配置、多源配置读取顺序分析

时间:2023-06-13 12:56:00浏览次数:47  
标签:读取 配置文件 配置 t2 configBuilder var config

NET CORE Configuraion 使用详解 获取配置文件参数 读取环境变量、读取配置文件、读取Ini配置、读取Xml配置、多源配置读取顺序分析
https://blog.csdn.net/qq_32109957/article/details/127998326

相关配置

  1. <Project Sdk="Microsoft.NET.Sdk">
  2. <PropertyGroup>
  3. <OutputType>Exe</OutputType>
  4. <TargetFramework>netcoreapp3.1</TargetFramework>
  5. </PropertyGroup>
  6. <ItemGroup>
  7. <!--读取配置的核心包-->
  8. <PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.0" />
  9. <!--Json中提取配置-->
  10. <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.0" />
  11. <!--Xml中提取配置-->
  12. <PackageReference Include="Microsoft.Extensions.Configuration.Xml" Version="3.1.0" />
  13. <!--Ini中提取配置-->
  14. <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="3.1.0" />
  15. <!--环境变量中提取配置-->
  16. <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.0" />
  17. <!--命令行中提取配置-->
  18. <PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.0" />
  19. <!--依赖注入-->
  20. <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.0" />
  21. <!--将配置数据绑定到对象的相关引用-->
  22. <PackageReference Include="Microsoft.Extensions.Options" Version="3.1.0" />
  23. <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="3.1.0" />
  24. </ItemGroup>
  25. <ItemGroup>
  26. <None Update="tsconfig.ini">
  27. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  28. </None>
  29. <None Update="tsconfig.json">
  30. <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  31. </None>
  32. <None Update="tsconfig.xml">
  33. <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  34. </None>
  35. </ItemGroup>
  36. </Project>
  1. //tsconfig.dev.json
  2. {
  3. "ConnectionStrings": {
  4. "db1": "dev_xx1,xx",
  5. "db2": "dev_xx2,xx"
  6. },
  7. "t1": {
  8. "t2": {
  9. "t3": "dev_t1_t2_t3_val"
  10. }
  11. },
  12. "c1": {
  13. "c2": "dev_c1_c2_val"
  14. },
  15. "d1": {
  16. "d2": "dev_d1_d2_val"
  17. }
  18. }
  19. //tsconfig.json
  20. {
  21. "ConnectionStrings": {
  22. "db1": "xx1,xx",
  23. "db2": "xx2,xx"
  24. },
  25. "t1": {
  26. "t2": {
  27. "t3": "t1_t2_t3_val"
  28. }
  29. },
  30. "c1": {
  31. "c2": "c1_c2_val"
  32. },
  33. "d1": {
  34. "d2": "d1_d2_val"
  35. }
  36. }
  37. //tsconfig.ini
  38. MyKey="MyIniConfig.ini Value"
  39. [Position]
  40. Title="My INI Config title"
  41. Name="My INI Config name"
  42. [Logging:LogLevel]
  43. Default=Information
  44. Microsoft=Warning
  45. //tsconfig.xml
  46. <?xml version="1.0" encoding="utf-8" ?>
  47. <configuration>
  48. <MyKey>MyXMLFile Value</MyKey>
  49. <Position>
  50. <Title>Title from MyXMLFile</Title>
  51. <Name>Name from MyXMLFile</Name>
  52. </Position>
  53. <Logging>
  54. <LogLevel>
  55. <Default>Information</Default>
  56. <Microsoft>Warning</Microsoft>
  57. </LogLevel>
  58. </Logging>
  59. </configuration>

读取环境变量

引用:

<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.1.0" />
  1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  2. configBuilder.AddEnvironmentVariables(prefix: "test_");
  3. var config = configBuilder.Build();
  4. //读取test_p1环境变量的值,这里不需要【test_】前缀
  5. var p1 = config["p1"];
  6. Console.WriteLine($"test_1:{p1}");

运行结果 :

 

示例代码说明:

1、test_ 前缀的环境变量会被加载到程序,如果没有前缀会加载所有环境变量。
2、需要注意的是,在读取环境变量时不需要前缀。
3、DOTNET_ 和 ASPNETCORE_ 前缀会由 ASP.NET Core 用于主机和应用配置,但不用于用户配置,详细介绍可以参考:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-7.0

读取配置文件 

注意:需要设置tsconfig.json文件的属性为【如果较新则复制】或【者始终复制】 

  1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  2. /*
  3. optional:参数表示这个文件是否可选,如果它的值为true,则当配置文件不存在的时候,程序不会报错;如果它的值为false,当配置文件不存在的时候,程序会报错
  4. eloadOnChange:参数表示如果文件修改了,是否重新加载配置
  5. */
  6. configBuilder.AddJsonFile("tsconfig.json", optional: false, reloadOnChange: false);
  7. IConfigurationRoot config = configBuilder.Build();
  8. //获取连接字符串,读取“ConnectionStrings”节点下的名为【db2】的连接字符串值
  9. var conn = config.GetConnectionString("db2");
  10. Console.WriteLine($"conn:{conn}");
  11. string value = config.GetSection("t1:t2:t3").Value;
  12. Console.WriteLine($"value={value}");

 运行结果:

读取Ini配置

  1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  2. configBuilder.AddEnvironmentVariables(prefix: "test_");
  3. configBuilder.AddIniFile("tsconfig.ini", optional: false, reloadOnChange: false);
  4. IConfigurationRoot config = configBuilder.Build();
  5. var myKeyValue = config["MyKey"];
  6. var title = config["Position:Title"];
  7. var positionName = config["Position:Name"];
  8. var defaultLogLevel = config["Logging:LogLevel:Default"];
  9. Console.WriteLine($"MyKey value: {myKeyValue} \n" +
  10. $"Title: {title} \n" +
  11. $"Name: {positionName} \n" +
  12. $"Default Log Level: {defaultLogLevel}");

 运行结果:

 读取Xml配置

  1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  2. configBuilder.AddEnvironmentVariables(prefix: "test_");
  3. configBuilder.AddXmlFile("tsconfig.xml", optional: false, reloadOnChange: false);
  4. IConfigurationRoot config = configBuilder.Build();
  5. var myKeyValue = config["MyKey"];
  6. var title = config["Position:Title"];
  7. var positionName = config["Position:Name"];
  8. var defaultLogLevel = config["Logging:LogLevel:Default"];
  9. Console.WriteLine($"MyKey value: {myKeyValue} \n" +
  10. $"Title: {title} \n" +
  11. $"Name: {positionName} \n" +
  12. $"Default Log Level: {defaultLogLevel}");

 运行结果:

 使用选项方式读取配置

  1. //注意:reloadOnChange 需要设置为true
  2. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  3. configBuilder.AddJsonFile("tsconfig.json", optional: false, reloadOnChange: true);
  4. IConfigurationRoot config = configBuilder.Build();
  5. //配置依赖注入
  6. IServiceCollection services = new ServiceCollection();
  7. services.AddOptions().Configure<OptionConnectionStrings>(c => config.GetSection("ConnectionStrings").Bind(c));
  8. services.AddTransient<Demo>();
  9. using (var sp = services.BuildServiceProvider())
  10. {
  11. while (true)
  12. {
  13. using (var scope = sp.CreateScope())
  14. {
  15. var spScope = scope.ServiceProvider;
  16. var demo = spScope.GetRequiredService<Demo>();
  17. demo.Test();
  18. }
  19. Console.WriteLine("可以改配置啦");
  20. Console.ReadKey();
  21. }
  22. }
  23. public class Demo
  24. {
  25. /*
  26. 1、IOptions<T>在配置改变后,我们不能读到新的值,必须重启程序才可以读到新的值;
  27. 2、IOptionsMonitor<T>在配置改变后,我们能读到新的值;
  28. 3、IOptionsSnapshot<T>也是在配置改变后,我们能读到新的值,和IOptionsMonitor<T>不同的是,在同一个范围内IOptionsMonitor<T>会保持一致性。
  29. 通俗地说,在一个范围内,如果有A、B两处代码都读取了某个配置项,在运行A之后且在运行B之前,这个配置项改变了,那么如果我们用IOptionsMonitor<T>读取配置,
  30. 在A处读到的将会是旧值,而在B处读到的是新值;如果我们用IOptionsSnapshot<T>读取配置,在A处和B处读到的都是旧值,只有再次进入这个范围才会读到新值
  31. */
  32. //private readonly IOptions<OptionConnectionStrings> optDbSettings;
  33. //private readonly IOptionsMonitor<OptionConnectionStrings> optDbSettings;
  34. private readonly IOptionsSnapshot<OptionConnectionStrings> optDbSettings;
  35. public Demo(IOptionsSnapshot<OptionConnectionStrings> optDbSettings)
  36. {
  37. this.optDbSettings = optDbSettings;
  38. }
  39. public void Test()
  40. {
  41. var db = optDbSettings.Value;
  42. Console.WriteLine($"数据库:{db.db1},{db.db2}");
  43. }
  44. }

 第一次运行和修改配置文件后运行结果:

 命令行读取配置

  1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  2. configBuilder.AddCommandLine(args);
  3. IConfigurationRoot config = configBuilder.Build();
  4. /*
  5. 这里所用“:”号分层,对应json 格式为:
  6. {
  7. "t1":{
  8. "t2":{
  9. "t3":"t1_t2_t3_val"
  10. }
  11. }
  12. }
  13. */
  14. string server = config["t1:t2:t3"];
  15. Console.WriteLine($"value:{server}");

 运行结果:

 多源配置读取顺序分析

配置顺序如下:

 1、配置文件
 2、环境变量
 3、命令行            
 结论:后添加的配置提供程序中的配置覆盖会之前的配置

  1. ConfigurationBuilder configBuilder = new ConfigurationBuilder();
  2. configBuilder
  3. .AddJsonFile("tsconfig.json", optional: false, reloadOnChange: true)
  4. .AddJsonFile("tsconfig.dev.json", optional: false, reloadOnChange: true)
  5. .AddEnvironmentVariables()
  6. .AddCommandLine(args);
  7. IConfigurationRoot config = configBuilder.Build();
  8. Console.WriteLine($"t1:t2:t3={config["t1:t2:t3"]}\r\n" +
  9. $"c1:c2={config["c1:c2"]}\r\n" +
  10. $"d1:d2={config["d1:d2"]}\r\n" +
  11. $"ConnectionStrings:db1={config["ConnectionStrings:db1"]}");

运行结果: 

红色字体代表最终的输出结果: 

添加顺序ConnectionStrings:db1t1:t2:t3c1:c2d1:d2
dev.json配置文件dev_xx1,xxdev_t1_t2_t3_valdev_c1_c2_valdev_d1_d2_val
json配置文件xx1,xxt1_t2_t3_valc1_c2_vald1_d2_val
环境变量s_c1_c2_vals_d1_d2_val
命令行m_t1_t2_t3_valm_d1_d2_val

参考:

 【.NET Core框架】配置(Configuration) - .Neterr - 博客园

ASP.NET Core 中的配置 | Microsoft Learn 

标签:读取,配置文件,配置,t2,configBuilder,var,config
From: https://www.cnblogs.com/sunny3158/p/17477224.html

相关文章

  • centos系统配置离线yum源
    背景在生产环境中,服务器会由于某些无法连接到公网,而我们想在这样的服务器上安装软件时会出现依赖导致安装失败。我们可以通过配置离线的yum源解决类似问题。大概流程为1、在公网环境下载yum源;2、将yum源上传到服务器;3、配置离线yum源。下面详细介绍如何配置yum源。下载yum源文......
  • MySQL读取的记录和我想象的不一致
    摘要:并发的事务在运行过程中会出现一些可能引发一致性问题的现象,本篇将详细分析一下。本文分享自华为云社区《MySQL读取的记录和我想象的不一致——事物隔离级别和MVCC》,作者:砖业洋__。事务的特性简介1.1原子性(Atomicity)要么全做,要么全不做,一系列操作都是不可分割的,如果在执......
  • 【Linux】CentOS防火墙操作:开启端口、开启、关闭、配置
    ......
  • Typora 轻量化配置自动上传图片至Gitee
    Typora轻量化配置自动上传图片至Gitee目录​ 目录​ 前言​ 下载upgit​ 创建Gitee仓库​ 配置upgit和typora​ 功能测试前言​ 各位师傅可能会在使用Typora写有图博客的时候,出现上传博客网站手动重新导图,本文主要使用upgit实现轻量化的自动上传图片至Gitee仓库。这样......
  • FTP配置文件文件详解
    设置匿名用户访问FTPanonymous_enable=YES//设置是否允许匿名用户登录FTP服务器,默认为YES。  write_enable=YES//是否对登录用户开启写权限,属全局性设置,默认NO。local_enable=YES//是否允许本地用户登录FTP服务器,默认为NO。ftp_userna......
  • SSM整合开发配置
    SSM整合开发配置配置类作用web(controllerspringmvc)业务逻辑层数据访问层(mybatis)web->业务逻辑层->数据访问层->数据源(连接池)->数据库(book表)spring框架负责把三层架构中的所有对象的创建以及属性的赋值SSM整合流程创建工程SSM整合(配置文件版)功能模......
  • 小灰灰深度学习day9——多线程读取小批量数据(这里运行的时候报错了,目前还不会解决,
    在这里先把代码放上来importtorchimporttimeimportnumpyasnpimporttorchvisionfromtorch.utilsimportdatafromtorchvisionimporttransformsfromd2limporttorchasd2ld2l.use_svg_display()#利用svg显示图片importosos.environ["KMP_DUPLICATE_LIB_OK......
  • thunderBird如何选择配置文件
    有时候,thunderBird会出现配置文件太老的提示,然后就不能用了,让你重新配置,这可烦死了。其实配置文件信息还在的,只是需要重新配置,选择配置文件。 只要在windows命令行下,找到thunderBird的安装位置,Programfiles(x86),然后运行命令:thunderBird.exe-ProfileManager然后会跳出一......
  • 华为配置案例1:配置远程登录交换机
    1.使用Telnet访问华为设备(1)配置telnet登录真机上需要先启用telnet服务[AR1]telnetserverenable1password认证AR1配置telnet[AR1]user-interfacevty04[AR1-ui-vty0-4]authentication-modepasswordPleaseconfiguretheloginpassword(maximumlength16):6[AR1-ui-vty0-4]......
  • Springboot读取不到yml文件的问题(转载)
    Springboot工程分为两个大文件夹,/src/main和/src/test,main和test下面分别由java和resource,如图所示: 规则:main的java里面的代码,只能读取main的resource的配置文件;test的java里面的代码,既可以读取main的resource的配置文件,也可以读取test的resource的配置文件。test......