【问题标题】:ConfigurationManager.AppSettings CachingConfigurationManager.AppSettings 缓存
【发布时间】: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 服务。

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

【问题讨论】:

    标签: asp.net .net performance caching configurationmanager


    【解决方案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关于剩余的谜团。

          【讨论】:

            猜你喜欢
            • 2012-09-21
            • 2011-07-13
            • 1970-01-01
            • 2013-08-30
            • 1970-01-01
            • 2018-10-02
            • 1970-01-01
            • 1970-01-01
            • 2010-09-05
            相关资源
            最近更新 更多