【发布时间】:2017-09-06 13:16:44
【问题描述】:
在两个项目(一个 .NET Core Web API 和一个 .NET Core WindowsService)中,我使用 appsettings.json 进行配置。
var configuration = new ConfigurationBuilder()
.SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
在两者中,我都将 reloadOnChange 设置为 true,并通过依赖注入将其用作注入 IOptions。在 web api 中进入控制器类,在服务中进入使用设置的类。
不幸的是,当 appsettings.json 更改时,我发现这些值不会更改。
在 web api 上,我创建了一个控制器来从配置中返回一个字符串值,这与启动时保持相同。
所以我的问题:
- 任何人都知道这是否应该开箱即用(至少在 web api 中)?
- 我必须做些什么才能让它起作用?
【问题讨论】:
-
您如何注册您的选项?你用
services.Configure<MyAppSettings>(Confiugration.GetSection(...))吗?还是你使用.Bind()? -
在这两种情况下 services.Configure
(Configure.GetSection(...)) -
通常它通过调用上述重载 (github.com/aspnet/Options/blob/rel/1.1.0/src/…) 时注册的更改令牌起作用,github.com/aspnet/Options/blob/rel/1.1.0/src/… 在触发令牌时触发重新绑定
-
@LukasHieronimusAdler 您只需使用 AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 和 reloadOnChange true。如果您在注入依赖项而不是 IOptions 的构造函数中使用 IOptionsSnapshot,您将始终获得注入的更新快照。诀窍仍然是跟踪知道您的实例何时创建。一些服务被注册为单例,因此选项只被注入一次,并且不会接收到设置的更新版本(因为不再进行注入)。例如在 DBContext 连接字符串上......
-
@LukasHieronimusAdler 您可以像 Microsoft.Extensions.DependencyInjection 中的 ServiceProvider 中的任何其他服务一样“查询”您的 IOptionsSnapshot,例如像 YourCustomOptionsClass 选项 = ServiceProvider.GetService
>().Value;每次查询选项时,它将是最新版本。如果您查询 Options 而不是 IOptionsSnapshot 它不会得到更新。 (据我所知)。
标签: json asp.net-core .net-core appsettings asp.net-core-webapi