重新加载configuration,而无需使用ConfigurationManager.RefreshSection重新启动应用程序

有没有人得到这个Web应用程序的工作?

无论我做什么,似乎我的appSettings部分(从web.configredirect使用appSettings文件=“。\ Site \ site.config”)不会重新加载。

我注定不得不重新启动应用程序的情况吗? 我希望这种方法能让我成为一个更高性能的解决scheme。

更新:

通过“重新加载”我的意思是刷新ConfigurationManager.AppSettings,而不必完全重新启动我的ASP.NET应用程序,并不得不承担通常的启动延迟。

确保将正确的区分大小写的值传递给RefreshSection,即

ConfigurationManager.RefreshSection("appSettings"); 

这似乎是一个缺陷(也许是一个bug),当你的appSettings使用外部configuration文件。 我已经尝试了使用configSource属性和RefreshSection从来没有工作,我假设这是相同的,当使用文件属性。 如果你把你的appSettings移回你的web.config中,RefreshSection将会完美的工作,否则恐怕你注定了。

出于某种原因ConfigurationManager.RefreshSection("appSettings")不适合我。 将Web.Config重新加载到configuration对象似乎正常工作。 以下代码假定Web.Config文件是执行(bin)文件夹下的一个目录。

 ExeConfigurationFileMap configMap = new ExeConfigurationFileMap(); Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)); string appPath = uriAssemblyFolder.LocalPath; configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 

并用于:

 string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value; 

作为替代scheme,您可以编写自己的ConfigSection并设置restartOnExternalChanges="false"

然后,在使用ConfigurationManager.GetSection("yourSection")读取该部分时,将自动刷新设置而不重新启动应用程序

你可以实现你的设置强types或NameValueCollection。

当appSettings是外部的.RefreshSection()不起作用。

但是,您可以使用以下来更改值:

 ConfigurationManager.AppSettings.Set(key, value) 

这不会改变文件上的设置,只会改变内存中的加载值。

所以,而不是使用RefreshSection我做了以下几点:

 string configFile="path to your config file"; XmlDocument xml = new XmlDocument(); xml.Load(configFile); foreach (XmlNode node in xml.SelectNodes("/appSettings/add")) { string key = node.Attributes["key"].Value; string value= node.Attributes["value"].Value; ConfigurationManager.AppSettings.Set(key, value); } 

对AppSettings.Get的任何后续调用将包含更新的值。

appSettings将被更新,而无需重新启动应用程序。

是。 你坚持iis重启。

有一个与asp.net 4.0和iis 7.5function,最初的启动被删除。

我不确定这是否可以在networking应用程序,但它在桌面应用程序。 尝试使用ConfigurationSettings而不是ConfigurationManager(它会对你使用过时的类…),然后读取所有的数据到一个类。 当你想刷新时,只需创build一个新的实例,并删除所有对旧实例的引用。 我的理论为什么这个工作(可能是错误的):当你没有直接访问app.config文件整个运行时,文件锁被应用程序丢弃。 然后,可以在不访问文件时进行编辑。

App.Config设置在应用程序启动时caching在内存中。 出于这个原因,我不认为你可以在不重新启动应用程序的情况下更改这些设置。 另外一个非常简单的方法是创build一个单独的,简单的XMLconfiguration文件,并自己处理加载/caching/重载。

要这样写:

昏暗的configuration为System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(“〜”)

返回AddOrUpdateAppSetting(config,“YourSettingKey”,“YourValueForTheKey”)

要读取并确保您获取文件中的值,而不是caching中的值,请按照以下方式阅读:

 Dim config As System.Configuration.Configuration = WebConfigurationManager.OpenWebConfiguration("~") Return config.AppSettings.Settings("TheKeyYouWantTheValue").Value 

完整的例子:

 Protected Shared Function AddOrUpdateAppSetting( _ ByVal Config As System.Configuration.Configuration _ , ByVal TheKey As String _ , ByVal TheValue As String _ ) As Boolean</p> Dim retval As Boolean = True Dim Itm As System.Configuration.KeyValueConfigurationElement = _ Config.AppSettings.Settings.Item(TheKey) If Itm Is Nothing Then If Config.AppSettings.Settings.IsReadOnly Then retval = False Else Config.AppSettings.Settings.Add(TheKey, TheValue) End If Else ' config.AppSettings.Settings(thekey).Value = thevalue If Itm.IsReadOnly Then retval = False Else Itm.Value = TheValue End If End If If retval Then Try Config.Save(ConfigurationSaveMode.Modified) Catch ex As Exception retval = False End Try End If Return retval End Function 

您是否尝试将自己的AppSettings存储在自己的外部文件中?

从app.config / web.config:

 <appSettings configSource="appSettings.config"></appSettings> 

appSettings.config:

 <?xml version="1.0"?> <appSettings> <add key="SomeKey" value="SomeValue" /> </appSettings> 

应该立即反映对appSettings.config所做的更改。 更多信息: http : //msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx