检测ConfigurationManager中appSettings的重新加载

时间:2012-01-17 15:54:16

标签: asp.net dynamic configuration

我们在运行时配置应用程序的各个部分:

ConfigurationManager.AppSettings["someKey"] = "someValue";

这个代码是在一个http模块的init上调用的,所以它很早就可以正常运行了。 原因是一个框架,我们(提供框架的人)希望避免框架的用户(我们公司的其他开发人员)

  • 忘记将此设置添加到web.config或
  • 在其特定的web.configs中添加错误的值

现在,在某些情况下(即高内存压力),ConfigurationManager显然会丢弃appSettings的NameValueCollection并重新加载文件中的值,这样我们通过代码添加的键/值就会丢失

有时在Web应用程序运行几个小时后会发生这种情况。它非常非常罕见,只有当Web应用程序看起来很重时才会发生。

现在的问题是:

有没有办法

  • 阻止配置管理器删除并重新加载appSettings(这将包括对RefreshSection的调用)或
  • 检测配置管理器何时删除其appSettings部分,以便我们能够做出反应并再次添加密钥或
  • 还有其他方法可以通过代码将值放入appSettings并持久化,直到应用程序下次重新启动,而不实际更改web.config文件吗?

更新:确定值被删除的原因(内存压力)

3 个答案:

答案 0 :(得分:0)

由于这些AppSettings适用于自定义组件(您的)并且您显然能够在需要时提供合理的默认值,因此对我来说明智的选择是不要担心它是否被转储和重新加载。而是创建一个配置包装类(您甚至可能已经有一个),使用它来包装对AppSettings的任何调用,如果定义了键然后返回值,否则返回默认值。

无需担心这种预防/检测/反应。

答案 1 :(得分:0)

除非这些手动添加的设置不应该成为配置的一部分,否则为什么不保存它们呢?

ConfigurationManager.AppSettings["someKey"] = "someValue";
ConfigurationManager.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

这种方式即使删除哈希表,也会从配置文件中重新加载值。

答案 2 :(得分:0)

Kevin P. Rice在评论中提出的解决方案非常适合这个问题。 这里回答:Is there a way to override ConfigurationManager.AppSettings?