【问题标题】:When are settings from app.config actually read?何时真正读取 app.config 中的设置?
【发布时间】:2012-03-01 04:52:13
【问题描述】:

应用程序何时真正读取 app.config 中的设置?

假设我有一个 Windows 服务和一些应用程序设置。在代码中,我有一种使用某些设置的方法。每次迭代都会调用方法,而不是一直调用一次。如果我通过配置文件更改设置值,我应该重新启动服务以使其在内部“刷新”,还是下次接受它而无需我的任何交互?

【问题讨论】:

    标签: c# .net configuration app-config


    【解决方案1】:

    您需要调用ConfigurationManager.RefreshSection 方法来获取直接从磁盘读取的最新值。这里有一个简单的方法来测试和回答您的问题:

    static void Main(string[] args)
    {
        while (true)
        {
            // There is no need to restart you application to get latest values.
            // Calling this method forces the reading of the setting directly from the config.
            ConfigurationManager.RefreshSection("appSettings");
            Console.WriteLine(ConfigurationManager.AppSettings["myKey"]);
    
            // Or if you're using the Settings class.
            Properties.Settings.Default.Reload();
            Console.WriteLine(Properties.Settings.Default.MyTestSetting);
    
            // Sleep to have time to change the setting and verify.
            Thread.Sleep(10000);
        }
    }
    

    我的 app.config 包含:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
          <section name="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
      </configSections>
      <appSettings>
        <add key="myKey" value="Original Value"/>
      </appSettings>
      <userSettings>
        <ConsoleApplication2.Properties.Settings>
          <setting name="MyTestSetting" serializeAs="String">
            <value>Original Value</value>
          </setting>
        </ConsoleApplication2.Properties.Settings>
      </userSettings>
    </configuration>
    

    启动应用程序后,打开 build 文件夹中的 app.config,并更改 appSetting "myKey" 的值。您会看到新值打印到控制台。

    要回答这个问题,是的,我认为它们在每次读取时都会被缓存,并且要强制直接从磁盘读取,您需要刷新该部分。

    【讨论】:

    • 如果我得到这样的设置:Properties.Settings.Default.MyValue?
    • 使用 Properties.Settings.Default.Reload();
    • @26071986 - 我更新了我的答案以反映使用 Settings 类时的代码。
    • 谢谢。现在好多了:)
    • 作为测试者的说明,在我的机器上这只能在没有附加调试器的情况下工作。
    【解决方案2】:

    当您通过配置管理器 (ConfigurationManager.GetSection("x/y");) 加载它或尝试访问属性时。

    这里有一个轻微的灰色区域,因为当您通过配置管理器获取配置时:

    var config = (MyConfigSection)ConfigurationManager.GetSection("MyConfigSection");
    

    如果您在配置文件顶部的 configurationSections 元素中提供了配置节类型,您将获得一个配置对象。如果您实际上没有提供实际配置,您仍然会得到一个对象。

    但是,如果您有一个未设置的必填字段,则在您调用该属性之前它不会引发异常。我在尝试对我的自定义配置部分进行单元测试时解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2020-06-01
      • 2013-01-09
      • 2010-10-26
      • 2018-04-07
      • 1970-01-01
      相关资源
      最近更新 更多