IHostBuilder 配置无法加载 xml 个文件

IHostBuilder configuration cannot load xml files

我有一位同事对在这里发帖有疑问,他将负责回复评论和验证答案。这是他的问题:

我在 Microsoft.Extensions.Hosting 中使用 Net5。我需要使用 xml 文件,而不是 appsettings.json。我有 App.config 指定通用应用程序设置(log4net 配置等)和 AcquisitionManagerConfiguration.xml 用于每个安装的设置(硬件内容)。

我是这样走的: Program.cs

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            IHostBuilder ihb = Host.CreateDefaultBuilder(args);
            ihb.ConfigureAppConfiguration((hostingContext, configuration) =>
            {
                
                //configuration.Sources.Clear();
                configuration.SetBasePath(AppContext.BaseDirectory);
                configuration.AddXmlFile("AcquisitionManagerConfiguration.xml", optional: false, reloadOnChange: true)
                   .AddXmlFile("App.config", optional: false, reloadOnChange: true);

                configuration.AddEnvironmentVariables();

            }).ConfigureServices((hostingContext, services) =>
            {
               
                services.AddHttpClient();               
                services.Configure<AcquisitionManagerConfiguration>(hostingContext.Configuration.GetSection("AcquisitionManagerConfiguration"));
                services.AddTransient<AcquisitionManager.AcquisitionManager>();
                services.AddTransient<IServiceClient, ServiceClient>();
                services.AddHostedService<Worker>();
            });
            return ihb;
        }
    }

AcquisitionManager.cs

public AcquisitionManager(IServiceClient serviceClient, IOptions<AcquisitionManagerConfiguration> config)
{
client = serviceClient;
configuration = config.Value;
}

和第一个xml

    <?xml version="1.0" encoding="utf-8" ?>
    <AcquisitionManagerConfiguration>
        <val>1</val>
    </AcquisitionManagerConfiguration>

AcquisitionManagerConfiguration.cs 与 xml 完全匹配,如果我手动反序列化它工作正常。

但是使用托管系统,我在 config.Value 中从来没有任何东西。

知道我做错了什么吗? 我没有找到解决方案,所以我在这里发布。 感谢您的帮助。

您似乎只是缺少服务注册中的 Bind 部分。

services.Configure<AcquisitionManagerConfiguration>(options => Configuration.GetSection("AcquisitionManagerConfiguration"));

应该是

services.Configure<AcquisitionManagerConfiguration>(options => Configuration.GetSection("AcquisitionManagerConfiguration").Bind(options));

问题来自xml结构:

因为这是应用程序配置,结构来自:

    <?xml version="1.0" encoding="utf-8" ?>
    <AcquisitionManagerConfiguration>
        <val>1</val>
    </AcquisitionManagerConfiguration>

变成这样:

    <?xml version="1.0" encoding="utf-8" ?>
    <Configuration>
        <AcquisitionManagerConfiguration>
            <val>1</val>
        </AcquisitionManagerConfiguration>
    </Configuration>