文章目錄
- 前言
- 一、配置源與默認設置
- 二、使用步驟
- 1)創建項目并添加配置
- 2)配置文件
- 3)強類型配置類
- 4)配置Program.cs
- 5)控制器中使用配置
- 6)配置優先級測試
- 7)動態重載配置測試
- 8)運行結果示例
- 總結
前言
集成配置系統的主要目的是將應用程序的配置信息與代碼分離,使得配置信息可以在不需要修改代碼的情況下進行維護。這樣可以提高應用程序的靈活性和可維護性。
ASP.NET Core 提供了一種靈活的配置系統,可以輕松地將配置信息從不同的來源加載到應用程序中,并且可以根據環境變量、命令行參數、JSON 文件、XML 文件、環境變量等不同來源來管理配置。
一、配置源與默認設置
- ASP.NET Core默認通過CreateDefaultBuilder方法預配置了多種配置源,優先級從低到高依次為:
- appsettings.json
- appsettings.{Environment}.json
- 用戶機密(開發環境)
- 環境變量
- 命令行參數
二、使用步驟
1)創建項目并添加配置
項目結構:
- AspNetCoreConfiguration
- Controllers/
- TestConfigurationController.cs
- Entity/
- AppConfig.cs
- SmtpSettings.cs
- appsettings.json
- appsettings.Development.json
- config.xml
- Program.cs
- Controllers/
2)配置文件
-
appsettings.json
{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","AppConfig": {"ApiName": "My API","MaxRecords": 100,"EnableCaching": false} }
-
appsettings.Development.json(開發環境專用)
{"AppConfig": {"EnableCaching": true},"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}} }
-
config.xml(自定義XML配置源)
<?xml version="1.0" encoding="utf-8" ?> <configuration><AppConfig><ApiName>XMLApiName熱重載222</ApiName><MaxRecords>200</MaxRecords><EnableCaching>false</EnableCaching></AppConfig> </configuration>
3)強類型配置類
- AppConfig.cs
namespace AspNetCoreConfiguration.Entity {public class AppConfig{public string ApiName { get; set; }public int MaxRecords { get; set; }public bool EnableCaching { get; set; }} }
- SmtpSettings.cs
namespace AspNetCoreConfiguration.Entity {public record SmtpSettings{public string Server { get; set; }public string UserName { get; set; }public string Password { get; set; }} }
4)配置Program.cs
- 示例
var builder = WebApplication.CreateBuilder(args); //注冊配置文件及它們的優先級 builder.Configuration.AddJsonFile("mysettings.json", optional: true, reloadOnChange: true).AddXmlFile("config.xml", optional: true, reloadOnChange: true).AddEnvironmentVariables("MyEnvironment_").AddCommandLine(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();//配置數據庫 builder.WebHost.ConfigureAppConfiguration((hostCtx, configBuilder) => {string connStr = builder.Configuration.GetSection("ConnectionString").Value;configBuilder.AddDbConfiguration(() => new SqlConnection(connStr), reloadOnChange: true, reloadInterval: TimeSpan.FromSeconds(2));});//配置Redis builder.Services.AddSingleton<IConnectionMultiplexer>(sp => {return ConnectionMultiplexer.Connect(builder.Configuration.GetSection("Redis").Value); });//綁定配置節到類 builder.Services.Configure<AppConfig>(builder.Configuration.GetSection("AppConfig")); builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("Smtp"));var app = builder.Build();if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI();//開發環境加載用戶機密builder.Configuration.AddUserSecrets<Program>(); } app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();
5)控制器中使用配置
- TestConfigurationController.cs
using AspNetCoreConfiguration.Entity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using StackExchange.Redis;namespace AspNetCoreConfiguration.Controllers {[Route("api/[controller]/[action]")][ApiController]public class TestConfigurationController : ControllerBase{private readonly IWebHostEnvironment _webHostEnvironment;private readonly AppConfig appconfig;private readonly SmtpSettings smtpConfig;private readonly IConfiguration _configuration;private readonly ILogger<TestConfigurationController> logger;private readonly IConnectionMultiplexer connectionMultiplexer;public TestConfigurationController(IWebHostEnvironment webHostEnvironment,IOptionsSnapshot<AppConfig> options,//支持配置熱重載IConfiguration configuration,ILogger<TestConfigurationController> logger,IConnectionMultiplexer connectionMultiplexer,IOptionsSnapshot<SmtpSettings> smtpConfigOptions){_webHostEnvironment = webHostEnvironment;appconfig = options.Value;_configuration = configuration;this.logger = logger;this.connectionMultiplexer = connectionMultiplexer;smtpConfig = smtpConfigOptions.Value;}[HttpGet]public string GetRedisOrSmtpConfig() {var pingDataBase = connectionMultiplexer.GetDatabase(0).Ping();logger.LogInformation($"DatabaseBase:{pingDataBase}");logger.LogInformation($"Smtp:{smtpConfig}");return "";}[HttpGet]public IActionResult GetConfigInfo(){//return Ok(new { // ApiName=appconfig.ApiName,// MaxRecords = appconfig.MaxRecords,// EnableCaching = appconfig.EnableCaching//});logger.LogInformation($"強類型訪問appconfig.XXX:{appconfig.ApiName},{appconfig.MaxRecords},{appconfig.EnableCaching}");logger.LogInformation($"直接訪問_configuration[AppConfig:xxx]:{_configuration["AppConfig:ApiName"]},{_configuration["AppConfig:MaxRecords"]},{_configuration["AppConfig:EnableCaching"]}");return Ok(_configuration["AppConfig:ApiName"]+ _configuration["AppConfig:MaxRecords"] + _configuration["AppConfig:EnableCaching"]);}[HttpGet]public string GetEnvironmentConfigValue(){return _webHostEnvironment.EnvironmentName;}} }
6)配置優先級測試
通過不同方式覆蓋配置值
-
命令行參數 (最高優先級):
AppConfig:ApiName=Bat_ApiName AppConfig:MaxRecords=1000 AppConfig:EnableCaching=true
-
環境變量 (使用雙下劃線 __):
-
用戶機密 (僅Development環境):
//配置secrets.json{"AppConfig:ApiName": "user_Secrets_ApiName","AppConfig:MaxRecords": "3000","AppConfig:EnableCaching": "true",}
7)動態重載配置測試
- 修改 appsettings.json 或 config.xml 中的值。
- 無需重啟應用,刷新接口即可看到更新后的值(通過 IOptionsSnapshot<T> 注入)。
8)運行結果示例
- 假設配置優先級生效順序為:用戶機密>命令行 > 環境變量 > XML > appsettings.json
- 請求響應:
總結
- 配置源優先級:后添加的源優先級更高,用戶機密 > 命令行 > 環境變量 > 自定義XML >
appsettings.{Environment}.json > appsettings.json。 - 強類型綁定:通過 services.Configure() 注冊,使用
IOptions<T>/IOptionsSnapshot<T> 注入。 - 熱重載:確保 reloadOnChange: true,并使用 IOptionsSnapshot<T> 或
IOptionsMonitor<T>。 - 環境變量:使用雙下劃線 __ 替代層級符號(如 AppSettings__Title)。
- 用戶機密:僅用于開發環境,通過 dotnet user-secrets 管理。