You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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.Configuration
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.Configuration.Xml
  • Microsoft.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:50:00