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

1.3 核心依賴包
# 基礎(chǔ)依賴 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json Microsoft.Extensions.Configuration.EnvironmentVariables Microsoft.Extensions.Configuration.CommandLine # 選項(xiàng)模式增強(qiáng) Microsoft.Extensions.Options Microsoft.Extensions.Options.ConfigurationExtensions
二、基礎(chǔ)數(shù)據(jù)提取方法詳解
2.1 IConfiguration 直接訪問模式
2.1.1 初始化配置系統(tǒng)
// Program.cs 構(gòu)建配置
var builder = WebApplication.CreateBuilder(args);
// 顯式配置加載(默認(rèn)已自動加載)
builder.Configuration
.AddJsonFile("appsettings.json", optional: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
.AddEnvironmentVariables()
.AddCommandLine(args);
2.1.2 數(shù)據(jù)讀取方法
// 控制器或服務(wù)中注入
private readonly IConfiguration _config;
public MyController(IConfiguration config)
{
_config = config;
}
// 基礎(chǔ)讀取
string connStr = _config.GetConnectionString("Default");
// 層級結(jié)構(gòu)訪問
string logLevel = _config["Logging:LogLevel:Default"]; // 返回 "Information"
// 強(qiáng)類型轉(zhuǎn)換
int timeout = _config.GetValue<int>("RequestTimeout", 30); // 默認(rèn)值30
// 數(shù)組讀取
var servers = _config.GetSection("Email:Servers").Get<string[]>();
2.1.3 原理剖析
數(shù)據(jù)結(jié)構(gòu):內(nèi)存中的扁平化字典(IDictionary<string, string>)
鍵名轉(zhuǎn)換規(guī)則:
- JSON 層級使用冒號分隔:
"Parent": { "Child": "value" }→Parent:Child - 數(shù)組使用數(shù)字索引:
"Servers": ["smtp1", "smtp2"]→Servers:0,Servers:1
2.2 選項(xiàng)模式(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 服務(wù)注冊
builder.Services.Configure<EmailSettings>(
builder.Configuration.GetSection(EmailSettings.SectionName));
2.2.3 配置使用方式
// 構(gòu)造函數(shù)注入IOptions<T>
private readonly EmailSettings _emailSettings;
public EmailService(IOptions<EmailSettings> emailOptions)
{
_emailSettings = emailOptions.Value; // 直接獲取配置實(shí)例
}
// 方法中使用
public void SendEmail()
{
foreach (var server in _emailSettings.Servers)
{
// 使用配置發(fā)送郵件...
}
}
2.2.4 高級選項(xiàng)接口對比
| 接口類型 | 生命周期 | 配置更新響應(yīng) | 使用場景 |
|---|---|---|---|
| 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 命名選項(xiàng)(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"
}
}
}
// 服務(wù)注冊
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");
}
}
三、高級配置技術(shù)解析
3.1 環(huán)境變量覆蓋機(jī)制
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)響應(yīng)配置變化
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 配置驗(yàn)證技術(shù)
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) });
}
}
}
// 啟用驗(yàn)證
builder.Services.AddOptions<EmailSettings>()
.Bind(builder.Configuration.GetSection("Email"))
.ValidateDataAnnotations()
.ValidateOnStart(); // 應(yīng)用啟動時(shí)驗(yàn)證
四、企業(yè)級配置管理方案
4.1 多環(huán)境配置策略
appsettings.json # 基礎(chǔ)配置 appsettings.Development.json # 開發(fā)環(huán)境(本地) appsettings.Staging.json # 預(yù)發(fā)布環(huán)境 appsettings.Production.json # 生產(chǎn)環(huán)境
4.2 安全配置實(shí)踐
4.2.1 敏感數(shù)據(jù)保護(hù)
// 使用Secret Manager(開發(fā)環(huán)境)
dotnet user-secrets set "Database:Password" "P@ssw0rd"
// 生產(chǎn)環(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;
}
);
五、配置技術(shù)對比分析
5.1 方法對比表
| 提取方法 | 適用場景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|---|
| IConfiguration | 簡單配置、快速原型開發(fā) | 零學(xué)習(xí)成本、直接訪問 | 弱類型、無驗(yàn)證、易出錯(cuò) |
| IOptions | 全局靜態(tài)配置 | 強(qiáng)類型、依賴注入友好 | 不支持運(yùn)行時(shí)更新 |
| IOptionsSnapshot | 請求級配置、多租戶系統(tǒng) | 支持作用域生命周期、熱更新 | 每次請求重新綁定配置 |
| IOptionsMonitor | 全局配置監(jiān)聽、后臺服務(wù) | 跨作用域更新通知、單例模式 | 實(shí)現(xiàn)復(fù)雜度較高 |
| Named Options | 同類型多配置實(shí)例 | 靈活管理多個(gè)配置組 | 配置結(jié)構(gòu)復(fù)雜化 |
5.2 性能基準(zhǔn)測試
BenchmarkDotNet=v0.13.1, OS=Windows 10
Intel Core i7-11800H 2.30GHz, 1 CPU, 16 logical cores
| 方法 | 調(diào)用次數(shù) | 平均耗時(shí) | 內(nèi)存分配 |
|----------------------|----------|----------|----------|
| 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 最佳實(shí)踐指南
1.分層配置策略
builder.Configuration
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json") // 基礎(chǔ)配置
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true) // 環(huán)境配置
.AddEnvironmentVariables() // 環(huán)境變量覆蓋
.AddCommandLine(args) // 命令行參數(shù)
.AddUserSecrets<Program>() // 開發(fā)機(jī)密
.AddAzureKeyVault(/*生產(chǎn)環(huán)境*/); // 生產(chǎn)機(jī)密
2.配置凍結(jié)技術(shù)(高性能場景)
// 啟動時(shí)凍結(jié)配置
var frozenConfig = new ConfigurationBuilder()
.AddConfiguration(builder.Configuration)
.Build()
.AsFrozen(); // 自定義擴(kuò)展方法
services.AddSingleton(frozenConfig);
3.配置變更審計(jì)
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配置已變更");
});
}
}
六、結(jié)論:構(gòu)建穩(wěn)健的配置體系
6.1 配置系統(tǒng)設(shè)計(jì)原則
- 安全優(yōu)先:敏感數(shù)據(jù)必須隔離存儲(Key Vault/Secrets Manager)
- 環(huán)境隔離:嚴(yán)格區(qū)分開發(fā)、測試、生產(chǎn)配置
- 強(qiáng)類型導(dǎo)向:選項(xiàng)模式為主,避免魔法字符串
- 變更可觀測:實(shí)現(xiàn)配置變更審計(jì)和通知
- 性能可控:關(guān)鍵服務(wù)使用配置凍結(jié)技術(shù)
6.2 配置方案選型決策樹

6.3 未來演進(jìn)方向
1.AI驅(qū)動的動態(tài)配置:根據(jù)運(yùn)行指標(biāo)自動調(diào)整參數(shù)
services.AddSmartConfig<PerformanceSettings>(config =>
{
config.AutoTune("ConnectionPoolSize",
min: 5,
max: 100,
metric: () => ThreadPool.GetAvailableThreads());
});
2.區(qū)塊鏈配置存證:關(guān)鍵配置變更上鏈審計(jì)
3.量子安全加密:抗量子計(jì)算的配置加密方案
到此這篇關(guān)于.Net讀取配置文件appsetting.json的幾種方法的文章就介紹到這了,更多相關(guān).Net讀取json文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
動態(tài)指定任意類型的ObjectDataSource對象的查詢參數(shù)
我在使用ObjectDataSource控件在ASP.NET中實(shí)現(xiàn)Ajax真分頁 一文中詳細(xì)介紹過如何使用ObjectDataSource和ListView實(shí)現(xiàn)數(shù)據(jù)綁定和分頁功能。事實(shí)上,采用ObjectDataSource和ListView相結(jié)合,可以減少我們很多的開發(fā)任務(wù)。2009-11-11
Asp.Net 5分鐘實(shí)現(xiàn)網(wǎng)頁實(shí)時(shí)監(jiān)控
在項(xiàng)目開發(fā)中經(jīng)常會用到監(jiān)控功能,下面通過本篇文章給大家介紹Asp.Net 5分鐘實(shí)現(xiàn)網(wǎng)頁實(shí)時(shí)監(jiān)控,需要的朋友可以參考下2017-12-12
asp.net用Zxing庫實(shí)現(xiàn)條形碼輸出的具體實(shí)現(xiàn)
這篇文章主要介紹了asp.net用Zxing庫實(shí)現(xiàn)條形碼輸出的具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12
.NET使用QuestPDF生成PDF的實(shí)戰(zhàn)指南
在數(shù)字化轉(zhuǎn)型的浪潮中,PDF文檔的生成需求早已從簡單的文本導(dǎo)出演變?yōu)閺?fù)雜的數(shù)據(jù)可視化、動態(tài)布局和跨平臺兼容性挑戰(zhàn),傳統(tǒng)PDF生成工具面臨API復(fù)雜、學(xué)習(xí)曲線陡峭、性能瓶頸等痛點(diǎn),QuestPDF的出現(xiàn),徹底改變了這一局面,本文將帶你全面掌握QuestPDF2025-08-08
利用ASP.NET MVC+EasyUI+SqlServer搭建企業(yè)開發(fā)框架
本文主要介紹使用asp.net mvc4、sqlserver、jquery2.0和easyui1.4.5搭建企業(yè)級開發(fā)框架的過程,希望能夠幫到大家。2016-04-04
asp.net iis 無法顯示網(wǎng)頁的解決方法分析
使用過IIS的朋友都可能遇到過這樣的情況:即使您按照教科書的步驟做好各步設(shè)置以后,仍會出現(xiàn)“無法顯示網(wǎng)頁”的現(xiàn)象。2010-06-06

