我有以下问题:我正在将新功能引入应用程序(作为Windows服务运行),我希望使用某种配置文件条目( myKey <)来控制(开/关)新功能/强>)。我可以在app.config中存储配置条目,但如果我想从on-&gt; off更改它,否则它将需要重新启动Windows服务,我想避免它。我希望我的应用程序能够运行并获取配置中的更改。
问题是:.NET中是否有一个构建机制来解决这个问题?我想我可以创建自己的配置文件,然后使用FileSystemWatcher
等......但也许.NET允许使用外部配置文件并重新加载值?
ConfigurationManager.AppSettings["myKey"]
谢谢,Pawel
编辑1:感谢您的回复。但是我编写了以下片段并且它不起作用(我尝试在两个地方创建 appSettingSection :在循环之前和之内):
static void Main(string[] args)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
// AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
for (int i = 0; i < 10; i++)
{
ConfigurationManager.RefreshSection("appSettings");
AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
string myConfigData = appSettingSection.Settings["myConfigData"].Value; // still the same value, doesn't get updated
Console.WriteLine();
Console.WriteLine("Using GetSection(string).");
Console.WriteLine("AppSettings section:");
Console.WriteLine(
appSettingSection.SectionInformation.GetRawXml()); // also XML is still the same
Console.ReadLine();
}
}
当应用程序在 Console.ReadLine()上停止时,我手动编辑配置文件。
答案 0 :(得分:6)
加载原始app.config文件后,会缓存它的值,因此您必须重新启动应用程序。解决这个问题的方法是创建一个新的配置对象并手动读取密钥,如下所示:
var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string myConfigData = appConfig.AppSettings.Settings["myConfigData"].Value;
答案 1 :(得分:1)
如果您手动处理配置(甚至可能不在app.config文件中),那么您可以定期检查该文件是否有更新。
FileSystemWatcher
......可能有点矫枉过正,并不能保证在所有情况下都有效。就个人而言,我每隔(比方说)30秒就会轮询一次文件。
答案 2 :(得分:0)
在读取值之前,只需刷新当前配置文件中的“appSettings”:
ConfigurationManager.RefreshSection("appSettings"); // Reload app settings from config file
ConfigurationManager.AppSettings["myKey"]; // Read the value as usually
无需通过创建另一个配置或配置或在您的问题或其他答案中提出的建议而使其过于复杂!