2010-12-11 88 views
4

在我正在ASP.Net上开发的应用程序之一中。在这个应用程序中,我们一直在使用大量的AppSettings。在最初的开发中,我们使用了ConfigurationManager.AppSettings [“”]。但随着开发的进展,我们创建了一个实用程序类,我们将为每个AppSettings定义一个静态属性。然后问题开始出现。现在,当应用程序部署在测试服务器上,并且我们更改AppSettings上的任何设置时,除非重新启动IIS,否则它没有任何作用。以下是我用来创建AppSettings的静态属性的以下代码片段。更改AppSetting对应用程序没有影响

public static class AppSettingsUtil 
{ 
     public static string Log4Net 
     { 
      get 
      { 
       return ConfigurationManager.AppSettings["Log4Net"]; 
      } 
     } 
} 

一个我能想到的原因是,它是一个静态属性,因此它可一次在其一生中这样下一次开始初始化,可能无法从AppSettings的获取值。

回答

10

我知道这是一个旧线程,但需要添加。

如果你使用:

<appSettings file="AppSettings.config" /> 

然后改到外部文件,直到更改web.config中订立或进行重新启动将不可用。

但如果把它修改成:

<appSettings configSource="AppSettings.config" /> 

这些设置的变化是在你的代码中没有立即重新启动或web.config中的变化。

我刚刚证实这是可重复测试的情况。

+0

不错的加法。这将有很大帮助。 – 2012-01-30 10:44:40

+2

有一点要注意。如果您使用configSource,那么您的web.config的appSettings部分中不能有任何条目。只在你的外部文件中。 如果您使用file =方法,那么您可以在两个位置都有条目...但您必须重新启动IIS(或更改web.config)才能读取您的外部文件。 – 2013-06-18 17:34:04

+1

感谢您解释“文件”与“configSource”位Ed!我一直在敲我的头,直到我找到了! – 2016-10-07 12:42:02

0

上下文中的静态方法永远不会缓存来自配置的值而不使用其中一个AOP框架。更可能的情况是网站未被编译并移入框架目录。就个人而言,我更喜欢将该文件称为Config.cs。

3

因为在重新启动IIS之后,您显然正在部署配置文件,所以更新的配置可用。

这听起来像你正在使用您的AppSettings外部文件:

<appSettings file="my-app-settings.config" /> 

这有利于保持web.config干净,特别是如果你保持独立的环境,不同的配置文件(例如,开发,测试,督促)。但是,这种方法的问题是ASP.NET不会自动检测外部文件的更改,因此您的设置不会自动刷新。

根据MSDN,对.NET Framework 2.0对单独文件的更改不会导致后续应用程序重新启动。这听起来像你的解决方案将是在这种情况下不使用外部文件。

+0

不是100%正确,请参阅下面的答案。不要使用“文件”属性,而是使用“configSource”属性。 – 2012-01-25 17:20:44