ConfigurationManager.AppSettings 缓存

Posted

技术标签:

【中文标题】ConfigurationManager.AppSettings 缓存【英文标题】:ConfigurationManager.AppSettings Caching 【发布时间】:2010-09-28 05:02:29 【问题描述】:

我们知道 IIS 会缓存 ConfigurationManager.AppSettings,因此它只会读取一次磁盘,直到 web.config 被更改。这样做是出于性能目的。

某人在:

http://forums.asp.net/p/1080926/1598469.aspx#1598469

表示 .NET Framework 不会对 app.config 执行相同的操作,但它会针对每个请求从磁盘读取。但我很难相信,因为它会更慢。请告诉我他错了,否则我将不得不修复我编写的每个控制台/Windows 窗体/Windows 服务。

更新我很遗憾我误解了人们在上面链接的论坛中所说的话。

【问题讨论】:

【参考方案1】:

快速测试似乎表明这些设置仅在应用程序启动时加载。

//edit the config file now.
Console.ReadLine();

Console.WriteLine(ConfigurationManager.AppSettings["ApplicationName"].ToString());
Console.WriteLine("Press enter to redisplay");

//edit the config file again now.
Console.ReadLine();
Console.WriteLine(ConfigurationManager.AppSettings["ApplicationName"].ToString());
Console.ReadLine();

您会看到所有输出都保持不变。

【讨论】:

只是为了挑剔,设置在第一次被引用时加载,不一定在应用程序启动时加载。 为了更加挑剔(并且偏离主题引导) - 无需调用 ToString() - 它已经是一个字符串 您只需检查 System.Configuration.ConfigurationManager 类,您会看到该类及其属性是静态的 您必须致电ConfigurationManager.RefreshSection("appSettings") 才能获得更改。您还可以添加一个文件观察器,以便仅在它更改时重新加载它。 为什么除了静态构造函数之外的任何东西都可以访问呢? (假设没有添加手表)另外——@SamuelNeff 所有设置都是在第一次参考时读取的,还是说不同的设置是在不同时间从同一个文件中读取的?如果是后者,我开始怀疑我们在雷德蒙德的朋友。【参考方案2】:

试试看,

ConfigurationManager.RefreshSection("appSettings")

请注意文件名(在 bin 文件夹中

普通文件名:appname.exe.config

如果调试模式:appname.vshost.exe.Config

【讨论】:

【参考方案3】:

有没有没有关系。如果没有,请不要修复性能问题。

【讨论】:

我有点不同意这里。像这样的配置值可能会在应用程序的各种地方使用,包括嵌套循环等。了解配置文件的读取是否需要微秒与毫秒是很重要的。【参考方案4】:

它在应用程序启动时读取应用程序配置文件 (MyApp.exe.config) 一次,可以通过在应用程序运行时更改文件轻松验证。

OP引用的论坛帖子中的评论是:

Web.config 的值为 存储到缓存/内存中时 应用程序启动因此为什么应用程序 进行任何更改时重新启动 web.config。请注意,这只 适用于 Web.config,任何其他 访问您可能使用的 .config 文件 默认来自磁盘

我将此注释解释为默认情况下从磁盘访问除 web.config 在 ASP.NET 应用程序中 之外的配置文件。同样,WinForms/Console 应用程序中 MyApp.exe.config 以外的配置文件默认从磁盘访问。

此注释并不是说默认从磁盘读取 MyApp.exe.config。

【讨论】:

【参考方案5】:

AppSettings 被缓存。您可以通过进一步缓存来限制 namevaluecollection 查找来提高性能。

见:DotNetPearls Static Config Pattern

【讨论】:

【参考方案6】:

正如 John 所说,只有在实际看到性能下降时才花更多时间在这方面。

此外,我很确定这些应用程序将配置保存在内存中,并且要查看配置中的任何更改,必须重新启动应用程序。 p>

对于一些further reading关于剩余的谜团。

【讨论】:

以上是关于ConfigurationManager.AppSettings 缓存的主要内容,如果未能解决你的问题,请参考以下文章