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

1.3 核心依賴包
# 基礎(chǔ)依賴 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json Microsoft.Extensions.Configuration.EnvironmentVariables Microsoft.Extensions.Configuration.CommandLine # 選項模式增強 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"
// 強類型轉(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 選項模式(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; // 直接獲取配置實例
}
// 方法中使用
public void SendEmail()
{
foreach (var server in _emailSettings.Servers)
{
// 使用配置發(fā)送郵件...
}
}
2.2.4 高級選項接口對比
| 接口類型 | 生命周期 | 配置更新響應(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 命名選項(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)境變量覆蓋機制
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 配置驗證技術(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) });
}
}
}
// 啟用驗證
builder.Services.AddOptions<EmailSettings>()
.Bind(builder.Configuration.GetSection("Email"))
.ValidateDataAnnotations()
.ValidateOnStart(); // 應(yīng)用啟動時驗證
四、企業(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 安全配置實踐
4.2.1 敏感數(shù)據(jù)保護
// 使用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)點 | 缺點 |
|---|---|---|---|
| IConfiguration | 簡單配置、快速原型開發(fā) | 零學(xué)習(xí)成本、直接訪問 | 弱類型、無驗證、易出錯 |
| IOptions | 全局靜態(tài)配置 | 強類型、依賴注入友好 | 不支持運行時更新 |
| IOptionsSnapshot | 請求級配置、多租戶系統(tǒng) | 支持作用域生命周期、熱更新 | 每次請求重新綁定配置 |
| IOptionsMonitor | 全局配置監(jiān)聽、后臺服務(wù) | 跨作用域更新通知、單例模式 | 實現(xiàn)復(fù)雜度較高 |
| Named Options | 同類型多配置實例 | 靈活管理多個配置組 | 配置結(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ù) | 平均耗時 | 內(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 最佳實踐指南
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ā)機密
.AddAzureKeyVault(/*生產(chǎn)環(huán)境*/); // 生產(chǎn)機密
2.配置凍結(jié)技術(shù)(高性能場景)
// 啟動時凍結(jié)配置
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配置已變更");
});
}
}
六、結(jié)論:構(gòu)建穩(wěn)健的配置體系
6.1 配置系統(tǒng)設(shè)計原則
- 安全優(yōu)先:敏感數(shù)據(jù)必須隔離存儲(Key Vault/Secrets Manager)
- 環(huán)境隔離:嚴(yán)格區(qū)分開發(fā)、測試、生產(chǎn)配置
- 強類型導(dǎo)向:選項模式為主,避免魔法字符串
- 變更可觀測:實現(xiàn)配置變更審計和通知
- 性能可控:關(guān)鍵服務(wù)使用配置凍結(jié)技術(shù)
6.2 配置方案選型決策樹

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

