.Net讀取配置文件appsetting.json的幾種方法
一、.NET 配置系統演進與核心架構
1.1 配置系統發(fā)展歷程
- 傳統 .NET Framework 時代:依賴
web.config/app.configXML 文件,通過ConfigurationManager靜態(tài)類訪問 - .NET Core 革命性變革:引入基于鍵值對的輕量級 JSON 配置(
appsettings.json),支持多源數據融合 - 現代化配置體系:環(huán)境感知、熱重載、選項模式等高級特性
1.2 配置系統核心組件

1.3 核心依賴包
# 基礎依賴 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json Microsoft.Extensions.Configuration.EnvironmentVariables Microsoft.Extensions.Configuration.CommandLine # 選項模式增強 Microsoft.Extensions.Options Microsoft.Extensions.Options.ConfigurationExtensions
二、基礎數據提取方法詳解
2.1 IConfiguration 直接訪問模式
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>)
鍵名轉換規(guī)則:
- JSON 層級使用冒號分隔:
"Parent": { "Child": "value" }→Parent:Child - 數組使用數字索引:
"Servers": ["smtp1", "smtp2"]→Servers:0,Servers:1
2.2 選項模式(Options Pattern)
2.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": "admin@domain.com",
"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)
{
// 使用配置發(fā)送郵件...
}
}
2.2.4 高級選項接口對比
| 接口類型 | 生命周期 | 配置更新響應 | 使用場景 |
|---|---|---|---|
| IOptions<T> | Singleton | ? | 配置初始化后不改變 |
| IOptionsSnapshot<T> | Scoped | ? | 請求級配置(支持熱更新) |
| IOptionsMonitor<T> | Singleton | ? | 全局配置監(jiān)控 |
// IOptionsMonitor 使用示例
public class ConfigMonitorService
{
private readonly EmailSettings _settings;
public ConfigMonitorService(IOptionsMonitor<EmailSettings> monitor)
{
_settings = monitor.CurrentValue;
monitor.OnChange(newSettings =>
{
Console.WriteLine($"配置已更新!新端口: {newSettings.Port}");
});
}
}
2.3 命名選項(Named Options)
// 配置類
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 環(huán)境變量覆蓋機制
3.1.1 環(huán)境變量命名規(guī)則
- 替換冒號為雙下劃線
__ - 全大寫格式(Linux 區(qū)分大小寫)
- 示例:
Logging__LogLevel__Default→LOGGING__LOGLEVEL__DEFAULT
3.1.2 Docker 部署示例
FROM mcr.microsoft.com/dotnet/aspnet:8.0 ENV LOGGING__LOGLEVEL__DEFAULT=Debug COPY ./app /app
3.2 配置熱重載(Hot Reload)
// 啟用熱重載
builder.Services.Configure<EmailSettings>(builder.Configuration.GetSection("Email"));
builder.Services.Configure<EmailSettings>(options =>
{
// 動態(tài)響應配置變化
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();
3.3 配置驗證技術
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(); // 應用啟動時驗證
四、企業(yè)級配置管理方案
4.1 多環(huán)境配置策略
appsettings.json # 基礎配置 appsettings.Development.json # 開發(fā)環(huán)境(本地) appsettings.Staging.json # 預發(fā)布環(huán)境 appsettings.Production.json # 生產環(huán)境
4.2 安全配置實踐
4.2.1 敏感數據保護
// 使用Secret Manager(開發(fā)環(huán)境)
dotnet user-secrets set "Database:Password" "P@ssw0rd"
// 生產環(huán)境使用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
});
4.3 分布式配置中心
// 使用Consul配置中心
builder.Configuration.AddConsul(
"appsettings.json",
options =>
{
options.ConsulConfigurationOptions = cco =>
{
cco.Address = new Uri("http://consul:8500");
};
options.ReloadOnChange = true;
options.Optional = false;
}
);
五、配置技術對比分析
5.1 方法對比表
| 提取方法 | 適用場景 | 優(yōu)點 | 缺點 |
|---|---|---|---|
| IConfiguration | 簡單配置、快速原型開發(fā) | 零學習成本、直接訪問 | 弱類型、無驗證、易出錯 |
| IOptions | 全局靜態(tài)配置 | 強類型、依賴注入友好 | 不支持運行時更新 |
| IOptionsSnapshot | 請求級配置、多租戶系統 | 支持作用域生命周期、熱更新 | 每次請求重新綁定配置 |
| IOptionsMonitor | 全局配置監(jiān)聽、后臺服務 | 跨作用域更新通知、單例模式 | 實現復雜度較高 |
| Named Options | 同類型多配置實例 | 靈活管理多個配置組 | 配置結構復雜化 |
5.2 性能基準測試
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 |
5.3 最佳實踐指南
1.分層配置策略
builder.Configuration
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json") // 基礎配置
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true) // 環(huán)境配置
.AddEnvironmentVariables() // 環(huán)境變量覆蓋
.AddCommandLine(args) // 命令行參數
.AddUserSecrets<Program>() // 開發(fā)機密
.AddAzureKeyVault(/*生產環(huán)境*/); // 生產機密
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配置已變更");
});
}
}
六、結論:構建穩(wěn)健的配置體系
6.1 配置系統設計原則
- 安全優(yōu)先:敏感數據必須隔離存儲(Key Vault/Secrets Manager)
- 環(huán)境隔離:嚴格區(qū)分開發(fā)、測試、生產配置
- 強類型導向:選項模式為主,避免魔法字符串
- 變更可觀測:實現配置變更審計和通知
- 性能可控:關鍵服務使用配置凍結技術
6.2 配置方案選型決策樹

6.3 未來演進方向
1.AI驅動的動態(tài)配置:根據運行指標自動調整參數
services.AddSmartConfig<PerformanceSettings>(config =>
{
config.AutoTune("ConnectionPoolSize",
min: 5,
max: 100,
metric: () => ThreadPool.GetAvailableThreads());
});
2.區(qū)塊鏈配置存證:關鍵配置變更上鏈審計
3.量子安全加密:抗量子計算的配置加密方案
到此這篇關于.Net讀取配置文件appsetting.json的幾種方法的文章就介紹到這了,更多相關.Net讀取json文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
.net core使用redis基于StackExchange.Redis
這篇文章主要為大家詳細介紹了.net core使用redis基于StackExchange.Redis的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04
高效的使用 Response.Redirect解決一些不必要的問題
這篇文章主要介紹了如何高效的使用 Response.Redirect解決一些不必要的問題,需要的朋友可以參考下2014-05-05
AntDesign Pro + .NET Core 實現基于JWT的登錄認證功能
這篇文章主要介紹了AntDesign Pro + .NET Core 實現基于JWT的登錄認證功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
.net core版 文件上傳/ 支持批量上傳拖拽及預覽功能(bootstrap fileinput上傳文件)
本篇內容主要解決.net core中文件上傳的問題 開發(fā)環(huán)境:ubuntu+vscode.本文給大家介紹的非常詳細,感興趣的朋友一起看看吧2017-03-03

