.NET 4.7.2 Windows服务如何合并app.config与secret.json配置?
.NET 4.7.2中XML与JSON配置合并实现方案(适配Autofac的Windows服务)
完全支持XML(app.config)与JSON配置混合使用,以下是具体实现步骤:
1. 引入必要NuGet包
.NET Framework没有内置Core版的ConfigurationBuilder,需要安装微软提供的兼容包:
Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.JsonMicrosoft.Extensions.Configuration.XmlMicrosoft.Extensions.Configuration.Binder(可选,用于将配置绑定到实体类,更优雅)
2. 构建混合配置体系
在Program.cs里替换原有的ConfigurationManager读取逻辑,用ConfigurationBuilder合并两种格式的配置:
using Autofac; using Microsoft.Extensions.Configuration; using System; using System.IO; namespace YourWindowsServiceNamespace { static class Program { static void Main() { // 初始化配置构建器 var configBuilder = new ConfigurationBuilder() // 加载app.config的全部配置节点 .AddXmlFile(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile, optional: false, reloadOnChange: true) // 加载Azure KeyVault流水线拉取的secret.json(替换为实际文件路径) .AddJsonFile("secret.json", optional: true, reloadOnChange: true); // 生成最终配置实例 IConfigurationRoot config = configBuilder.Build(); // 配置Autofac容器,注入配置实例 var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterInstance(config).As<IConfiguration>().SingleInstance(); // 注册你的服务类等业务组件 containerBuilder.RegisterType<YourWorkerService>().AsSelf(); using (var container = containerBuilder.Build()) { // 启动Windows服务逻辑 var service = container.Resolve<YourWorkerService>(); // ... 服务启动、运行代码 } } } }
3. 读取配置的两种常用方式
方式1:直接通过IConfiguration读取
在业务类中注入IConfiguration,按键值读取配置:
public class YourWorkerService { private readonly IConfiguration _config; public YourWorkerService(IConfiguration config) { _config = config; } public void ExecuteTask() { // 读取app.config中的appSettings节点配置 string appConfigValue = _config["appSettings:YourPublicKey"]; // 读取secret.json中的敏感配置 string secretValue = _config["DatabasePassword"]; // 读取连接字符串(XML和JSON中的连接字符串都能通过该方法读取) string dbConnStr = _config.GetConnectionString("MainDb"); } }
方式2:绑定到实体类(推荐)
先定义配置实体类:
public class ServiceConfig { public string YourPublicKey { get; set; } public string DatabasePassword { get; set; } public string MainDb { get; set; } }
然后在配置构建完成后绑定并注入Autofac:
var serviceConfig = new ServiceConfig(); config.Bind(serviceConfig); containerBuilder.RegisterInstance(serviceConfig).AsSelf().SingleInstance();
之后直接在业务类中注入ServiceConfig即可使用。
4. 关键注意事项
- 配置优先级:后加载的配置会覆盖先加载的。比如示例中secret.json后加载,若JSON与XML存在相同键,最终会使用JSON中的值,适合用敏感配置覆盖公开配置。
- 连接字符串格式:JSON中配置连接字符串需遵循
"ConnectionStrings": {"MainDb": "xxx"}的结构,这样GetConnectionString方法才能正常识别。 - 文件路径:确保secret.json被流水线下载到服务运行目录,若路径特殊,需在
AddJsonFile中指定完整路径。
内容的提问来源于stack exchange,提问作者Mr W
相关产品推荐
相关产品推荐

