平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“.Net读取配置文件appsetting.json的几种做法”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
web.config/app.config XML 文件,借助 ConfigurationManager 静态类访问appsettings.json),兼容多源数据融合
# 基础依赖
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.EnvironmentVariables
Microsoft.Extensions.Configuration.CommandLine
# 选项模式增强
Microsoft.Extensions.Options
Microsoft.Extensions.Options.ConfigurationExtensions
2.1.1 初始化设置系统
// Program.cs 构建配置
var builder = WebApplication.CreateBuilder(args);
// 显式配置加载(默认已自动加载)
builder.Configuration
.AddJsonFile("appsettings.json", optional: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
.AddEnvironmentVariables()
.AddCommandLine(args);
2.1.2 数据读取方法
// 控制器或服务中注入
private readonly IConfiguration _config;
public MyController(IConfiguration config)
{
_config = config;
}
// 基础读取
string connStr = _config.GetConnectionString("Default");
// 层级结构访问
string logLevel = _config["Logging:LogLevel:Default"]; // 返回 "Information"
// 强类型转换
int timeout = _config.GetValue<int>("RequestTimeout", 30); // 默认值30
// 数组读取
var servers = _config.GetSection("Email:Servers").Get<string[]>();
2.1.3 原理剖析
数据结构:内存中的扁平化字典(IDictionary<string, string>)
键名转换规则:
"Parent": { "Child": "value" } → Parent:Child"Servers": ["smtp1", "smtp2"] → Servers:0, Servers:12.2.1 设置类定义
public class EmailSettings
{
public const string SectionName = "Email";
public string FromAddress { get; set; }
public int Port { get; set; }
public string[] Servers { get; set; }
public bool EnableSsl { get; set; }
}
// appsettings.json
{
"Email": {
"FromAddress": "[email protected]",
"Port": 587,
"Servers": [ "smtp1.domain.com", "smtp2.domain.com" ],
"EnableSsl": true
}
}
2.2.2 服务注册
builder.Services.Configure<EmailSettings>(
builder.Configuration.GetSection(EmailSettings.SectionName));
2.2.3 设置采用方式
// 构造函数注入IOptions<T>
private readonly EmailSettings _emailSettings;
public EmailService(IOptions<EmailSettings> emailOptions)
{
_emailSettings = emailOptions.Value; // 直接获取配置实例
}
// 方法中使用
public void SendEmail()
{
foreach (var server in _emailSettings.Servers)
{
// 使用配置发送邮件...
}
}
2.2.4 高级选项接口对比
| 接口类型 | 生命周期 | 设置更新响应 | 采用场景 |
|---|---|---|---|
| IOptions<T> | Singleton | 设置初始化后不改变 | |
| IOptionsSnapshot<T> | Scoped | 请求级设置(兼容热更新) | |
| IOptionsMonitor<T> | Singleton | 全局设置坚控 |
// IOptionsMonitor 使用示例
public class ConfigMonitorService
{
private readonly EmailSettings _settings;
public ConfigMonitorService(IOptionsMonitor<EmailSettings> monitor)
{
_settings = monitor.CurrentValue;
monitor.OnChange(newSettings =>
{
Console.WriteLine($"配置已更新!新端口: {newSettings.Port}");
});
}
}
// 配置类
public class StorageOptions
{
public string ConnectionString { get; set; }
public string Container { get; set; }
}
// appsettings.json
{
"Storage": {
"Primary": {
"ConnectionString": "AccountEndpoint=...",
"Container": "main-container"
},
"Backup": {
"ConnectionString": "AccountEndpoint=...",
"Container": "backup-container"
}
}
}
// 服务注册
builder.Services.Configure<StorageOptions>("Primary",
builder.Configuration.GetSection("Storage:Primary"));
builder.Services.Configure<StorageOptions>("Backup",
builder.Configuration.GetSection("Storage:Backup"));
// 使用
public class StorageService
{
private readonly StorageOptions _primary;
private readonly StorageOptions _backup;
public StorageService(
IOptionsSnapshot<StorageOptions> options)
{
_primary = options.Get("Primary");
_backup = options.Get("Backup");
}
}
3.1.1 环境变量命名规则
__Logging__LogLevel__Default → LOGGING__LOGLEVEL__DEFAULT3.1.2 Docker 部署示例
FROM mcr.microsoft.com/dotnet/aspnet:8.0
ENV LOGGING__LOGLEVEL__DEFAULT=Debug
COPY ./app /app
// 启用热重载
builder.Services.Configure<EmailSettings>(builder.Configuration.GetSection("Email"));
builder.Services.Configure<EmailSettings>(options =>
{
// 动态响应配置变化
builder.Configuration.GetReloadToken().RegisterChangeCallback(
state =>
{
options.Port = builder.Configuration.GetValue<int>("Email:Port");
},
null
);
});
// .NET 6+ 简化方式
builder.Services.AddOptions<EmailSettings>()
.Bind(builder.Configuration.GetSection("Email"))
.ValidateDataAnnotations()
.ValidateOnStart();
public class EmailSettings : IValidatableObject
{
[Required]
[EmailAddress]
public string FromAddress { get; set; }
[Range(1, 65535)]
public int Port { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext context)
{
if (EnableSsl && Port == 25)
{
yield return new ValidationResult(
"SSL cannot be used with port 25",
new[] { nameof(Port), nameof(EnableSsl) });
}
}
}
// 启用验证
builder.Services.AddOptions<EmailSettings>()
.Bind(builder.Configuration.GetSection("Email"))
.ValidateDataAnnotations()
.ValidateOnStart(); // 应用启动时验证
appsettings.json # 基础配置
appsettings.Development.json # 开发环境(本地)
appsettings.Staging.json # 预发布环境
appsettings.Production.json # 生产环境
4.2.1 敏感数据保护
// 使用Secret Manager(开发环境)
dotnet user-secrets set "Database:Password" "P@ssw0rd"
// 生产环境使用Azure Key Vault
builder.Configuration.AddAzureKeyVault(
new Uri("https://myvault.vault.azure.net/"),
new DefaultAzureCredential());
4.2.2 设置加密方案
public class EncryptedJsonProvider : FileConfigurationProvider
{
private readonly Aes _aes;
public EncryptedJsonProvider(EncryptedJsonSource source) : base(source)
{
_aes = Aes.Create();
_aes.Key = Convert.FromBase64String(Environment.GetEnvironmentVariable("CONFIG_KEY"));
}
public override void Load(Stream stream)
{
using var cryptoStream = new CryptoStream(stream, _aes.CreateDecryptor(), CryptoStreamMode.Read);
base.Load(cryptoStream);
}
}
// 注册自定义提供程序
builder.Configuration.Add(new EncryptedJsonSource
{
Path = "appsettings.enc.json",
Optional = false
});
// 使用Consul配置中心
builder.Configuration.AddConsul(
"appsettings.json",
options =>
{
options.ConsulConfigurationOptions = cco =>
{
cco.Address = new Uri("http://consul:8500");
};
options.ReloadOnChange = true;
options.Optional = false;
}
);
| 提取方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| IConfiguration | 轻松设置、更快原型开发 | 零学习成本、直接访问 | 弱类型、无验证、易出错 |
| IOptions | 全局静态设置 | 强类型、依赖注入友好 | 不兼容运行时更新 |
| IOptionsSnapshot | 请求级设置、多租户系统 | 兼容作用域生命周期、热更新 | 每次请求重新绑定设置 |
| IOptionsMonitor | 全局设置、后台服务 | 跨作用域更新通知、单例模式 | 实现复杂度较高 |
| Named Options | 同类型多设置实例 | 灵活管理多个设置组 | 设置结构复杂化 |
BenchmarkDotNet=v0.13.1, OS=Windows 10
Intel 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 |
1.分层设置策略
builder.Configuration
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json") // 基础配置
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true) // 环境配置
.AddEnvironmentVariables() // 环境变量覆盖
.AddCommandLine(args) // 命令行参数
.AddUserSecrets<Program>() // 开发机密
.AddAzureKeyVault(/*生产环境*/); // 生产机密
2.设置冻结技术(高性能场景)
// 启动时冻结配置
var frozenConfig = new ConfigurationBuilder()
.AddConfiguration(builder.Configuration)
.Build()
.AsFrozen(); // 自定义扩展方法
services.AddSingleton(frozenConfig);
3.设置变更审计
public class ConfigAuditService : IOptionsChangeTokenSource<EmailSettings>
{
private readonly ILogger _logger;
public ConfigAuditService(ILogger<ConfigAuditService> logger)
{
_logger = logger;
}
public IChangeToken GetChangeToken()
{
return new ChangeToken(() =>
{
_logger.LogInformation("EmailSettings配置已变更");
});
}
}

1.AI驱动的动态设置:根据运行指标自动调整参数
services.AddSmartConfig<PerformanceSettings>(config =>
{
config.AutoTune("ConnectionPoolSize",
min: 5,
max: 100,
metric: () => ThreadPool.GetAvailableThreads());
});
2.区块链设置存证:关键设置变更上链审计
3.量子安全加密:抗量子计算的设置加密方案
到此这篇关于.Net读取设置文件appsetting.json的几种方法的文章就介绍到这了,更多相关.Net读取json文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!