Search code examples
c#asp.net-core.net-5

IHostBuilder configuration cannot load xml files


I have a co-worker who have a problem with posting here, he will be the one answering comments and validating answer. Here is his question:

I'm using Net5 with Microsoft.Extensions.Hosting. Instead of appsettings.json, I need to use xml files. I have App.config to specify common app settings (log4net config, etc.) and AcquisitionManagerConfiguration.xml for the settings on each installation (hardware stuff).

I went like this : 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;
}

and the first xml

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

AcquisitionManagerConfiguration.cs matches exactly the xml, it worked fine if I manually deserialize.

But using the hosting system, I never have anything in config.Value.

Any idea what I'm doing wrong ? I didn't find the solution so I posted here. Thanks for the help.


Solution

  • The problem come from the xml structure:

    As this is application configuration the structure from this:

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

    become this:

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