阅读appsettings.json贵吗?

时间:2018-01-18 08:34:25

标签: asp.net caching asp.net-core asp.net-core-2.0

目前我正在开发一个.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;
        }

1 个答案:

答案 0 :(得分:4)

Configuration API使用IConfigurationBuilder.Build方法构造键和值,该方法使用之前注册的源集合中的键和值构建IConfiguration

如果简要,请使用以下机制is implemented

  • 在内部,特定提供程序用于从已注册的源中读取。基于文件的源具有适当的FileConfigurationProvider。对于JSON文件,这是JsonConfigurationProvider
  • IConfigurationBuilder.Build方法为每个已注册的源构建提供程序,并调用provider.Load方法。
  • Load从源读取数据并填充键值对的内部Provider.Data集合(更具体的字典)。
  • 当您需要在应用中按键获取值时,Configuration API会使用此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);
               });
}