ASP.NET 5:如何在更改时重新加载强类型配置

问题描述 投票:0回答:3

我已经能够在 ASP.NET 5 中设置强类型配置,并且它运行得很好。我还将配置设置为在

.json
配置文件更改时自动重新加载。但这似乎只有在我使用非类型化配置时才有效。当
.json
文件更改时,强类型配置类仍保留旧值。

我正在设置这样的配置:

public IConfiguration Configuration { get; set; }
public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
    // Setup configuration sources
    var builder = new ConfigurationBuilder()
        .AddJsonFile("config.json")
        .AddJsonFile($"config.{env.EnvironmentName}.json");
    Configuration = builder.Build()
        .ReloadOnChanged("config.json")
        .ReloadOnChanged($"config.{env.EnvironmentName}.json");
    /* ... (unrelated stuff edited away) ... */
}

并像这样绑定它:

public void ConfigureServices(IServiceCollection services)
{
    /* ... (unrelated stuff edited away) ... */
    services.AddOptions();
    services.AddInstance(Configuration);
    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
    services.Configure<DbSettings>(Configuration.GetSection("DbSettings"));
    /* ... (unrelated stuff edited away) ... */
}

(配置文件如下所示:)

{
    "AppSettings": {
        "This": "that",
        "Foo": "bar"
        /* etc... */
    },
    "DbSettings": {
        /* (db settings here) */
    }
}

(我相应地有一个这样的 C# 类:)

public class AppSettings
{
    public string This { get; set; }
    public string Foo { get; set; }
    /* etc... */
}

当我通过依赖注入获取

IOptions<AppSettings>
时,当我更改
config.json
config.Dev.json
文件时,它不会改变。我必须重新启动整个网络应用程序才能更新配置类。但如果我改用无类型的
IConfiguration
实例,当我更改 json 文件时它会自动更改。

所以问题是:如何在更改 .json 文件时更改强类型配置,而无需重新启动 web 应用程序?

c# asp.net json configuration configuration-files
3个回答
2
投票

在 asp.net core 1.1 上它通过 IOptionsSnapshot

修复

0
投票

当调用

Configuration.GetSection()
时,它会在启动时传入该部分一次。

为了在运行时更新

AppSettings
选项,您必须将
AppSettings
选项绑定到配置节。

services.Configure<AppSettings>(option => Configuration.GetSection("AppSettings").Bind(option));

0
投票

距 ASP.NET 5 已经有一段时间了,但目前文档很清楚,

IOptions<T>
未读取更改。与
IOptionsSnapshot
IOptionsMonitor

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-8.0#the-options-pattern

使用

Bind
Get<T>
方法时也会读取更改,但不仅仅是调用
GetSection

© www.soinside.com 2019 - 2024. All rights reserved.