在.NET Core应用开发中,配置系统支持多种格式的配置源,XML是其中常用的一种。将XML配置文件的内容绑定到对象实例,可以让开发者以强类型的方式使用配置,避免频繁使用字符串键名获取配置值,减少出错概率。

XML配置文件的格式要求
首先需要在项目中准备符合规范的XML配置文件,默认情况下.NET Core的配置系统会读取XML中的配置节点,映射到对应的对象属性。以下是一个示例XML配置文件,命名为appsettings.xml:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<AppSettings>
<ServiceUrl>https://api.ipipp.com</ServiceUrl>
<MaxRetryCount>3</MaxRetryCount>
<EnableLog>true</EnableLog>
<AllowedHosts>
<Host>127.0.0.1</Host>
<Host>192.168.0.1</Host>
</AllowedHosts>
</AppSettings>
</configuration>
定义对应的对象模型
要让配置系统正确绑定XML内容,需要定义和XML节点结构匹配的类,类的属性名需要和XML中的节点名保持一致,支持嵌套结构和集合类型。
public class AppSettings
{
// 对应XML中的ServiceUrl节点
public string ServiceUrl { get; set; }
// 对应XML中的MaxRetryCount节点
public int MaxRetryCount { get; set; }
// 对应XML中的EnableLog节点
public bool EnableLog { get; set; }
// 对应XML中的AllowedHosts节点,集合类型对应多个Host子节点
public List<string> AllowedHosts { get; set; } = new List<string>();
}
注册XML配置源并绑定对象
在.NET Core应用的启动阶段,需要先将XML配置文件添加为配置源,再将配置节点绑定到定义好的对象模型上。如果是ASP.NET Core应用,修改Program.cs文件:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
var builder = WebApplication.CreateBuilder(args);
// 添加XML配置源,指定XML文件路径,optional表示文件不存在时不报错,reloadOnChange表示文件修改后自动重新加载
builder.Configuration.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);
// 将AppSettings节点绑定到AppSettings类,并注册到依赖注入容器
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
var app = builder.Build();
// 后续中间件配置等代码
app.Run();
获取绑定后的对象实例
完成配置注册后,就可以在业务代码中通过IOptions<T>接口获取绑定好的对象实例,该接口支持依赖注入,在控制器、服务等类中都可以使用。
在控制器中使用示例
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
[ApiController]
[Route("api/config")]
public class ConfigController : ControllerBase
{
private readonly AppSettings _appSettings;
// 通过构造函数注入IOptions<AppSettings>,获取配置绑定的实例
public ConfigController(IOptions<AppSettings> appSettingsOptions)
{
_appSettings = appSettingsOptions.Value;
}
[HttpGet]
public IActionResult GetConfig()
{
return Ok(new
{
ServiceUrl = _appSettings.ServiceUrl,
MaxRetryCount = _appSettings.MaxRetryCount,
EnableLog = _appSettings.EnableLog,
AllowedHosts = _appSettings.AllowedHosts
});
}
}
常见问题及解决方法
- 如果绑定后对象属性值为空,首先检查XML节点的名称和类的属性名是否完全一致,注意大小写是否匹配,XML节点名默认是大小写敏感的。
- 如果XML文件放在项目根目录,需要确保文件的属性设置为复制到输出目录,否则程序运行时无法找到该文件。
- 集合类型的节点绑定失败,需要确认XML中集合节点的子节点名称和集合的元素类型匹配,比如List<string>对应的子节点名可以是任意名称,多个同名的子节点会自动映射到集合中。
注意:如果使用IOptions<T>获取的实例不会跟随配置文件修改自动更新,如果需要实时获取最新的配置,可以使用IOptionsSnapshot<T>接口,该接口会在每次请求时重新读取配置。