【问题标题】:Is reading appsettings.json expensive?阅读 appsettings.json 贵吗?
【发布时间】:2018-06-27 06:23:08
【问题描述】:

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

【问题讨论】:

  • 为什么不把配置放在static 变量、Application 会话或MemoryCache 中?
  • 不知道是不是自动缓存,
  • 我不这么认为,但我习惯了aspnet,而不是core。但是在Startup 中输入一个登录信息,看看是否每个请求都会调用它。
  • reload on change 有一个选项的事实表明它被读取一次然后被缓存。
  • 它是缓存的,它并不昂贵,而且它实际上是正确场景下的一个非常好的实践。例如,假设您有一些配置数据,或者您的应用程序期望输入可能会发生变化。每次您想更改这些值时,您都必须重新编译您的应用程序。使用 appsettings.json,您只需更改它们,瞧!

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


【解决方案1】:

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

简单来说,如下机制is implemented

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

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

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

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 2019-06-04
    • 2015-12-23
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多