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