【问题标题】:Cannot use IOptionsMonitor to detect changes in ASP.NET Core无法使用 IOptionsMonitor 检测 ASP.NET Core 中的更改
【发布时间】:2018-03-23 16:18:54
【问题描述】:

我正在开发 Asp.Net Core 应用程序

我想在运行应用程序后更改配置设置

我正在使用 IOptionsMonitor,但它没有检测到更改

在 Startup.cs -> 我有 Configuration() 方法

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 所做的更改不会反映。

【问题讨论】:

  • 您是否将设置文件的 reloadChanges 标志设置为“true”?
  • @SimplyGed 是的,我做到了。
  • @PHPMODE 你能把IOptionsMonitor换成IOptionsSnapshot吗?
  • @win 试过了,不行。我正在尝试打开配置 JSON 文件并手动更改它(保存 -> 关闭)。这就是它的工作原理吗?
  • 您是否厌倦了将 AddSingleton 更改为 AddScoped?如果这有帮助,那么我会改变您在项目中使用 ConfigHelper 的方式。

标签: c# asp.net-core


【解决方案1】:

您是否像这样创建了您的 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();

【讨论】:

  • 非常感谢,这对我来说非常有用:)
【解决方案2】:

在使用 .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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多