设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 491|回复: 1

.Net读取配置文件appsetting.json的几种方法

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:15
  • 打卡月天数:0
  • 打卡总奖励:225
  • 最近打卡:2023-08-27 06:16:20
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
52
主题
42
精华
0
金钱
378
积分
104
注册时间
2023-8-12
最后登录
2025-9-1

发表于 2025-9-1 01:46:16 | 显示全部楼层 |阅读模式

一、.NET 配置系统演进与核心架构

1.1 配置系统发展历程

  • 传统 .NET Framework 时代:依赖
    1. web.config
    复制代码
    /
    1. app.config
    复制代码
    XML 文件,通过
    1. ConfigurationManager
    复制代码
    静态类访问
  • .NET Core 革命性变革:引入基于键值对的轻量级 JSON 配置(
    1. appsettings.json
    复制代码
    ),支持多源数据融合
  • 现代化配置体系:环境感知、热重载、选项模式等高级特性

1.2 配置系统核心组件

1.jpeg

1.3 核心依赖包

  1. # 基础依赖
  2. Microsoft.Extensions.Configuration
  3. Microsoft.Extensions.Configuration.Json
  4. Microsoft.Extensions.Configuration.EnvironmentVariables
  5. Microsoft.Extensions.Configuration.CommandLine
  6. # 选项模式增强
  7. Microsoft.Extensions.Options
  8. Microsoft.Extensions.Options.ConfigurationExtensions
复制代码

二、基础数据提取方法详解

2.1 IConfiguration 直接访问模式

2.1.1 初始化配置系统

  1. // Program.cs 构建配置
  2. var builder = WebApplication.CreateBuilder(args);
  3. // 显式配置加载(默认已自动加载)
  4. builder.Configuration
  5. .AddJsonFile("appsettings.json", optional: true)
  6. .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
  7. .AddEnvironmentVariables()
  8. .AddCommandLine(args);
复制代码

2.1.2 数据读取方法

  1. // 控制器或服务中注入
  2. private readonly IConfiguration _config;
  3. public MyController(IConfiguration config)
  4. {
  5. _config = config;
  6. }
  7. // 基础读取
  8. string connStr = _config.GetConnectionString("Default");
  9. // 层级结构访问
  10. string logLevel = _config["Logging:LogLevel:Default"]; // 返回 "Information"
  11. // 强类型转换
  12. int timeout = _config.GetValue<int>("RequestTimeout", 30); // 默认值30
  13. // 数组读取
  14. var servers = _config.GetSection("Email:Servers").Get<string[]>();
复制代码

2.1.3 原理剖析

数据结构:内存中的扁平化字典(

  1. IDictionary<string, string>
复制代码

键名转换规则

  • JSON 层级使用冒号分隔:
    1. "Parent": { "Child": "value" }
    复制代码
    1. Parent:Child
    复制代码
  • 数组使用数字索引:
    1. "Servers": ["smtp1", "smtp2"]
    复制代码
    1. Servers:0
    复制代码
    ,
    1. Servers:1
    复制代码

2.2 选项模式(Options Pattern)

2.2.1 配置类定义

  1. public class EmailSettings
  2. {
  3. public const string SectionName = "Email";
  4. public string FromAddress { get; set; }
  5. public int Port { get; set; }
  6. public string[] Servers { get; set; }
  7. public bool EnableSsl { get; set; }
  8. }
  9. // appsettings.json
  10. {
  11. "Email": {
  12. "FromAddress": "admin@domain.com",
  13. "Port": 587,
  14. "Servers": [ "smtp1.domain.com", "smtp2.domain.com" ],
  15. "EnableSsl": true
  16. }
  17. }
复制代码

2.2.2 服务注册

  1. builder.Services.Configure<EmailSettings>(
  2. builder.Configuration.GetSection(EmailSettings.SectionName));
复制代码

2.2.3 配置使用方式

  1. // 构造函数注入IOptions<T>
  2. private readonly EmailSettings _emailSettings;
  3. public EmailService(IOptions<EmailSettings> emailOptions)
  4. {
  5. _emailSettings = emailOptions.Value; // 直接获取配置实例
  6. }
  7. // 方法中使用
  8. public void SendEmail()
  9. {
  10. foreach (var server in _emailSettings.Servers)
  11. {
  12. // 使用配置发送邮件...
  13. }
  14. }
复制代码

2.2.4 高级选项接口对比

接口类型生命周期配置更新响应使用场景
IOptionsSingleton配置初始化后不改变
IOptionsSnapshotScoped请求级配置(支持热更新)
IOptionsMonitorSingleton全局配置监控
  1. // IOptionsMonitor 使用示例
  2. public class ConfigMonitorService
  3. {
  4. private readonly EmailSettings _settings;
  5. public ConfigMonitorService(IOptionsMonitor<EmailSettings> monitor)
  6. {
  7. _settings = monitor.CurrentValue;
  8. monitor.OnChange(newSettings =>
  9. {
  10. Console.WriteLine($"配置已更新!新端口: {newSettings.Port}");
  11. });
  12. }
  13. }
复制代码

2.3 命名选项(Named Options)

  1. // 配置类
  2. public class StorageOptions
  3. {
  4. public string ConnectionString { get; set; }
  5. public string Container { get; set; }
  6. }
  7. // appsettings.json
  8. {
  9. "Storage": {
  10. "Primary": {
  11. "ConnectionString": "AccountEndpoint=...",
  12. "Container": "main-container"
  13. },
  14. "Backup": {
  15. "ConnectionString": "AccountEndpoint=...",
  16. "Container": "backup-container"
  17. }
  18. }
  19. }
  20. // 服务注册
  21. builder.Services.Configure<StorageOptions>("Primary",
  22. builder.Configuration.GetSection("Storage:Primary"));
  23. builder.Services.Configure<StorageOptions>("Backup",
  24. builder.Configuration.GetSection("Storage:Backup"));
  25. // 使用
  26. public class StorageService
  27. {
  28. private readonly StorageOptions _primary;
  29. private readonly StorageOptions _backup;
  30. public StorageService(
  31. IOptionsSnapshot<StorageOptions> options)
  32. {
  33. _primary = options.Get("Primary");
  34. _backup = options.Get("Backup");
  35. }
  36. }
复制代码

三、高级配置技术解析

3.1 环境变量覆盖机制

3.1.1 环境变量命名规则

  • 替换冒号为双下划线
    1. __
    复制代码
  • 全大写格式(Linux 区分大小写)
  • 示例:
    1. Logging__LogLevel__Default
    复制代码
    1. LOGGING__LOGLEVEL__DEFAULT
    复制代码

3.1.2 Docker 部署示例

  1. FROM mcr.microsoft.com/dotnet/aspnet:8.0
  2. ENV LOGGING__LOGLEVEL__DEFAULT=Debug
  3. COPY ./app /app
复制代码

3.2 配置热重载(Hot Reload)

  1. // 启用热重载
  2. builder.Services.Configure<EmailSettings>(builder.Configuration.GetSection("Email"));
  3. builder.Services.Configure<EmailSettings>(options =>
  4. {
  5. // 动态响应配置变化
  6. builder.Configuration.GetReloadToken().RegisterChangeCallback(
  7. state =>
  8. {
  9. options.Port = builder.Configuration.GetValue<int>("Email:Port");
  10. },
  11. null
  12. );
  13. });
  14. // .NET 6+ 简化方式
  15. builder.Services.AddOptions<EmailSettings>()
  16. .Bind(builder.Configuration.GetSection("Email"))
  17. .ValidateDataAnnotations()
  18. .ValidateOnStart();
复制代码

3.3 配置验证技术

  1. public class EmailSettings : IValidatableObject
  2. {
  3. [Required]
  4. [EmailAddress]
  5. public string FromAddress { get; set; }
  6. [Range(1, 65535)]
  7. public int Port { get; set; }
  8. public IEnumerable<ValidationResult> Validate(ValidationContext context)
  9. {
  10. if (EnableSsl && Port == 25)
  11. {
  12. yield return new ValidationResult(
  13. "SSL cannot be used with port 25",
  14. new[] { nameof(Port), nameof(EnableSsl) });
  15. }
  16. }
  17. }
  18. // 启用验证
  19. builder.Services.AddOptions<EmailSettings>()
  20. .Bind(builder.Configuration.GetSection("Email"))
  21. .ValidateDataAnnotations()
  22. .ValidateOnStart(); // 应用启动时验证
复制代码

四、企业级配置管理方案

4.1 多环境配置策略

  1. appsettings.json # 基础配置
  2. appsettings.Development.json # 开发环境(本地)
  3. appsettings.Staging.json # 预发布环境
  4. appsettings.Production.json # 生产环境
复制代码

4.2 安全配置实践

4.2.1 敏感数据保护

  1. // 使用Secret Manager(开发环境)
  2. dotnet user-secrets set "Database:Password" "P@ssw0rd"
  3. // 生产环境使用Azure Key Vault
  4. builder.Configuration.AddAzureKeyVault(
  5. new Uri("https://myvault.vault.azure.net/"),
  6. new DefaultAzureCredential());
复制代码

4.2.2 配置加密方案

  1. public class EncryptedJsonProvider : FileConfigurationProvider
  2. {
  3. private readonly Aes _aes;
  4. public EncryptedJsonProvider(EncryptedJsonSource source) : base(source)
  5. {
  6. _aes = Aes.Create();
  7. _aes.Key = Convert.FromBase64String(Environment.GetEnvironmentVariable("CONFIG_KEY"));
  8. }
  9. public override void Load(Stream stream)
  10. {
  11. using var cryptoStream = new CryptoStream(stream, _aes.CreateDecryptor(), CryptoStreamMode.Read);
  12. base.Load(cryptoStream);
  13. }
  14. }
  15. // 注册自定义提供程序
  16. builder.Configuration.Add(new EncryptedJsonSource
  17. {
  18. Path = "appsettings.enc.json",
  19. Optional = false
  20. });
复制代码

4.3 分布式配置中心

  1. // 使用Consul配置中心
  2. builder.Configuration.AddConsul(
  3. "appsettings.json",
  4. options =>
  5. {
  6. options.ConsulConfigurationOptions = cco =>
  7. {
  8. cco.Address = new Uri("http://consul:8500");
  9. };
  10. options.ReloadOnChange = true;
  11. options.Optional = false;
  12. }
  13. );
复制代码

五、配置技术对比分析

5.1 方法对比表

提取方法适用场景优点缺点
IConfiguration简单配置、快速原型开发零学习成本、直接访问弱类型、无验证、易出错
IOptions全局静态配置强类型、依赖注入友好不支持运行时更新
IOptionsSnapshot请求级配置、多租户系统支持作用域生命周期、热更新每次请求重新绑定配置
IOptionsMonitor全局配置监听、后台服务跨作用域更新通知、单例模式实现复杂度较高
Named Options同类型多配置实例灵活管理多个配置组配置结构复杂化

5.2 性能基准测试

  1. BenchmarkDotNet=v0.13.1, OS=Windows 10Intel Core i7-11800H 2.30GHz, 1 CPU, 16 logical cores| 方法                 | 调用次数 | 平均耗时 | 内存分配 ||----------------------|----------|----------|----------|| IConfiguration.Get   | 1000000  | 125 ns   | 0 B      || IOptions.Value       | 1000000  | 38 ns    | 0 B      || IOptionsSnapshot.Get | 1000000  | 245 ns   | 64 B     || IOptionsMonitor.Get  | 1000000  | 192 ns   | 32 B     |
复制代码

5.3 最佳实践指南

1.分层配置策略

  1. builder.Configuration
  2. .SetBasePath(Directory.GetCurrentDirectory())
  3. .AddJsonFile("appsettings.json") // 基础配置
  4. .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true) // 环境配置
  5. .AddEnvironmentVariables() // 环境变量覆盖
  6. .AddCommandLine(args) // 命令行参数
  7. .AddUserSecrets<Program>() // 开发机密
  8. .AddAzureKeyVault(/*生产环境*/); // 生产机密
复制代码

2.配置冻结技术(高性能场景)

  1. // 启动时冻结配置
  2. var frozenConfig = new ConfigurationBuilder()
  3. .AddConfiguration(builder.Configuration)
  4. .Build()
  5. .AsFrozen(); // 自定义扩展方法
  6. services.AddSingleton(frozenConfig);
复制代码

3.配置变更审计

  1. public class ConfigAuditService : IOptionsChangeTokenSource<EmailSettings>
  2. {
  3. private readonly ILogger _logger;
  4. public ConfigAuditService(ILogger<ConfigAuditService> logger)
  5. {
  6. _logger = logger;
  7. }
  8. public IChangeToken GetChangeToken()
  9. {
  10. return new ChangeToken(() =>
  11. {
  12. _logger.LogInformation("EmailSettings配置已变更");
  13. });
  14. }
  15. }
复制代码

六、结论:构建稳健的配置体系

6.1 配置系统设计原则

  • 安全优先:敏感数据必须隔离存储(Key Vault/Secrets Manager)
  • 环境隔离:严格区分开发、测试、生产配置
  • 强类型导向:选项模式为主,避免魔法字符串
  • 变更可观测:实现配置变更审计和通知
  • 性能可控:关键服务使用配置冻结技术

6.2 配置方案选型决策树

2.jpeg

6.3 未来演进方向

1.AI驱动的动态配置:根据运行指标自动调整参数

  1. services.AddSmartConfig<PerformanceSettings>(config =>
  2. {
  3. config.AutoTune("ConnectionPoolSize",
  4. min: 5,
  5. max: 100,
  6. metric: () => ThreadPool.GetAvailableThreads());
  7. });
复制代码

2.区块链配置存证:关键配置变更上链审计

3.量子安全加密:抗量子计算的配置加密方案

到此这篇关于.Net读取配置文件appsetting.json的几种方法的文章就介绍到这了,更多相关.Net读取json文件内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2025-11-17 05:55:48 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表