阅读appsettings.json是否昂贵?

Cod*_*der 1 asp.net caching asp.net-core asp.net-core-2.0

当前,我正在开发一个.net core 2应用程序,该应用程序应根据域的每个请求从appsettings.json中读取一些键。(我不得不提到,我有3个共享相同appsettings.json的项目的单一解决方案)我担心每个请求上的appsettings.json文件的读取时间。应用启动时是否会缓存此文件?我的启动顾问如下:

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;
        }
Run Code Online (Sandbox Code Playgroud)

Set*_*Set 5

Configuration API使用以下IConfigurationBuilder.Build方法构造键和值:该方法使用IConfiguration之前注册的源集中的键和值进行构建。

如果简要地说,将实现以下机制:

  • 在内部,使用特定的提供程序从注册的源中读取。基于文件的源具有适当的FileConfigurationProvider。对于JSON文件,这是一个JsonConfigurationProvider
  • IConfigurationBuilder.Build方法为每个注册的源构造提供程序,并调用该provider.Load方法。
  • Load从源中读取数据,并填充Provider.Data键值对的内部集合(更具体的说是字典)。
  • Data然后,当您需要通过应用程序中的键获取值时,Configuration API会使用此集合。

当Configuration API创建FileConfigurationProvider实例时,它将使用FileConfigurationSource.ReloadOnChange属性的值(默认情况下为false)。如果此属性为true,则提供者订阅“文件更改”事件(在ctor中),以在Load每次文件更改时调用(并因此重新填充Data集合。来自github

if (Source.ReloadOnChange && Source.FileProvider != null)
{
    ChangeToken.OnChange(
         () => Source.FileProvider.Watch(Source.Path),
         () => {
                  Thread.Sleep(Source.ReloadDelay);
                  Load(reload: true);
               });
}
Run Code Online (Sandbox Code Playgroud)