无法使用IOptionsMonitor检测ASP.NET Core

时间:2018-03-23 16:18:55

标签: c# asp.net-core

我正在研究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所做的更改。

2 个答案:

答案 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;
        }
    }