我正在研究Asp.Net核心应用程序
我想在运行应用程序后更改配置设置
我正在使用IOptionsMonitor,但它没有检测到更改
在Startup.cs中 - >我有配置()方法
services.Configure<Config>(Configuration.GetSection("someConfig"));
在读取这些配置设置的其他类中,我写了类似
的内容var someConfig= serviceProvider.GetRequiredService<IOptionsMonitor<Config>>();
但是当我更改配置文件(Json File)时,未检测到更改,并且someConfig不会更改。
配置POCO课程:
public class Config
{
public string name {get; set;}
//More getters and setters
}
修改
services.AddSingleton<ConfigHelpers>;
我正在使用单个对象,我正在尝试读取配置。如果它不是一个snigleton,它工作正常。有没有办法在单例对象中更改配置?
在ConfigHelpers.cs
中var someConfig= serviceProvider.GetRequiredService<IOptionsMonitor<Config>();
因为它在Startup.cs中被定义为单例,所以不会反映对Config所做的更改。
答案 0 :(得分:2)
您是否创建了这样的aprox WebHostBuilder
:var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
var AppConfig = config.Get<AppConfig>();
var host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://*:" + (AppConfig.Port ?? 80))
.UseKestrel()
.UseIISIntegration()
// Clones your config values
.UseConfiguration(config)
.UseStartup<Startup>()
.Build();
然后它将克隆您的值,您将失去实时重新加载功能。
您必须使用 ConfigureAppConfiguration 并执行以下操作:
var host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseUrls("http://*:" + (AppConfig.Port ?? 80))
.UseKestrel()
.ConfigureAppConfiguration((builder, conf) =>
{
conf.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
})
.UseIISIntegration()
//.UseConfiguration(config)
.UseStartup<Startup>()
.Build();
答案 1 :(得分:0)
在使用.NET Core 3.1忙碌了一天之后,阅读了docs,各种博客和论坛文章,并实现了IOptionsMonitor,IOptions,IOptionsSnapshot,IConfiguration,IServiceCollection和IServiceProvider的所有建议的变体,这是我唯一的途径与JsonConfigurationProvider(appsettings.json)和ConfigureWebHostDefaults()一起使用的动态更新是一种相当丑陋的解决方法,可以根据以下问题在单例中实现:
/// <summary>
/// Reference to the application IConfiguration implementation
/// </summary>
static IConfiguration configuration;
/// <summary>
/// Reference buffer for Configuration property
/// </summary>
static AppConfiguration appConfiguration = new AppConfiguration();
/// <summary>
/// Access to the current configuration
/// </summary>
public static AppConfiguration Configuration
{
get
{
configuration.Bind("AppConfiguration", appConfiguration);
return appConfiguration;
}
}