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

时间:2008-10-07 16:16:04

标签: c# asp.net performance settings

有没有人在网络应用程序中使用它?

无论我做什么,似乎我的appSettings部分(使用appSettings file =“。\ Site \ site.config”从web.config重定向)都没有重新加载。

我注定要重新启动应用程序吗?我希望这种方法能够让我找到更高效的解决方案。

更新

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

10 个答案:

答案 0 :(得分:47)

确保将正确的case sensitive值传递给RefreshSection,即

ConfigurationManager.RefreshSection("appSettings");

答案 1 :(得分:13)

当您为appSettings使用外部配置文件时,这似乎是一个缺陷(可能是一个错误)。我已尝试使用configSource属性,而RefreshSection根本无法工作,我假设使用文件属性时这是相同的。 如果你将appSettings移回web.config中,RefreshSection将完美运行,否则我担心你注定失败了。

答案 2 :(得分:4)

出于某种原因,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;

答案 3 :(得分:3)

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

然后,当使用ConfigurationManager.GetSection("yourSection")阅读该部分时,设置将自动刷新,而无需重新启动应用

您可以实现强类型设置或NameValueCollection。

答案 4 :(得分:1)

当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,而无需重新启动应用程序。

答案 5 :(得分:0)

是。你坚持使用iis重启。

asp.net 4.0和iis 7.5有一个功能,即删除初始启动。

答案 6 :(得分:0)

我不确定这是否可以在网络应用中使用,但它适用于桌面应用。尝试使用ConfigurationSettings而不是ConfigurationManager(它会因使用过时的类而对你大喊大叫......),然后将所有数据读入类中。当您希望刷新时,只需创建一个新实例并删除对旧实例的所有引用。我的理论为什么这样做(可能是错误的):当你在整个运行时没有直接访问app.config文件时,应用程序就会删除文件锁。然后,当您不访问该文件时,可以进行编辑。

答案 7 :(得分:-1)

应用程序启动时,App.Config设置将缓存在内存中。因此,我认为如果不重新启动应用程序,您将无法更改这些设置。一个非常直接的替代方案是创建一个单独的,简单的XML配置文件,并自己处理加载/缓存/重新加载。

答案 8 :(得分:-1)

要写,请这样称呼:

Dim config As System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(“〜”)

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

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

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

答案 9 :(得分:-2)

您是否尝试将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