读取appsettings.json文件是否消耗资源?

7

我正在开发一个 .net core 2 应用程序,该应用程序应该根据域名在每个请求中从 appsettings.json 中读取一些键。(我必须提到,我有一个单一的解决方案,其中包含 3 个项目,它们共享相同的 appsettings.json)我担心每个请求中读取 appsettings.json 文件的时间。当应用程序启动时,这个文件是否会被缓存?我的 Startup 构造函数如下:

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;
        }

为什么不把配置放在“静态”变量、“Application”会话或“MemoryCache”中? - VDWWD
我不确定它是否会自动缓存。 - Coder
我不这么认为,但我习惯于使用aspnet而不是core。但在“Startup”中放置一个日志并查看它是否针对每个请求进行调用。 - VDWWD
4
有一个“重新加载更改”的选项表明该文件只会被读取一次,然后会被缓存。链接地址为:https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.configuration.jsonconfigurationextensions.addjsonfile?view=aspnetcore-2.0。 - SpruceMoose
2
它被缓存,不会很昂贵,并且在正确的场景下实际上是一种非常好的做法。例如,想象一下你有一些配置数据或者你的应用程序正在等待可能会改变的输入。每次想要更改这些值时,您都必须重新编译您的应用程序。使用appsettings.json,您只需更改它们,然后就完成了! - Nick
1个回答

15

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

简而言之,实现了以下机制

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

当配置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);
               });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接