目前我正在开发一个.net core 2应用程序,该应用程序应该在每个基于域的请求上从appsettings.json读取一些键。 (我必须提一下,我有一个单独的解决方案,共享3个项目,共享相同的appsettings.json)我关注每个请求上appsettings.json文件的读取时间。应用程序启动时是否会缓存此文件?我的Startup consrtuctor如下:
public IConfiguration Configuration { get; }
private readonly ILoggerFactory _logger;
public Startup(IHostingEnvironment env, ILoggerFactory logger)
{
string settingPath = Path.GetFullPath(Path.Combine(@"../SharedConfig/globalAppSettings.json"));
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(settingPath)
.AddEnvironmentVariables();
Configuration = builder.Build();
_logger = logger;
}
答案 0 :(得分:4)
Configuration API使用IConfigurationBuilder.Build
方法构造键和值,该方法使用之前注册的源集合中的键和值构建IConfiguration
。
如果简要,请使用以下机制is implemented:
FileConfigurationProvider
。对于JSON文件,这是JsonConfigurationProvider
。IConfigurationBuilder.Build
方法为每个已注册的源构建提供程序,并调用provider.Load
方法。 Load
从源读取数据并填充键值对的内部Provider.Data
集合(更具体的字典)。 Data
集合。当Configuration API创建FileConfigurationProvider
实例时,它使用FileConfigurationSource.ReloadOnChange
属性的值(默认为false)。如果此属性为true,则提供者每次更改文件时都会订阅“文件已更改”事件(在ctor中)以调用Load
(并重新填充Data
集合。来自{{3} }:
if (Source.ReloadOnChange && Source.FileProvider != null)
{
ChangeToken.OnChange(
() => Source.FileProvider.Watch(Source.Path),
() => {
Thread.Sleep(Source.ReloadDelay);
Load(reload: true);
});
}