应用程序实际读取app.config的设置是什么时候?
假设我有一个Windows服务和一些应用程序设置。在代码中我有一个方法,其中使用了一些设置。在每次迭代中都会调用方法,而不是在所有时间内调用一次。如果我通过配置文件更改设置值,我是否应该重新启动服务以使其在内部“刷新”,或者在下次没有任何交互的情况下接受它?
答案 0 :(得分:5)
您需要调用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”的值。您将看到打印到控制台的新值。
要回答这个问题,是的,我们会在第一次读取它们时缓存它们,并且要从磁盘强制读取,您需要刷新该部分。
答案 1 :(得分:1)
通过配置管理器(ConfigurationManager.GetSection(“x / y”);)或尝试访问属性时加载它。
此处有一个灰色区域,因为当您通过配置管理器获取配置时:
var config = (MyConfigSection)ConfigurationManager.GetSection("MyConfigSection");
如果在配置文件顶部的configurationSections元素中提供了配置节类型,则会返回配置对象。如果你实际上没有提供实际的配置,你仍然会得到一个对象。
但是,如果您有一个未设置的必填字段,则在您调用该属性之前不会抛出异常。在尝试对我的自定义配置部分进行单元测试时,我已经解决了这个问题。