代码之家  ›  专栏  ›  技术社区  ›  Kieran Benton

使用configurationManager.refreshSection在不重新启动应用程序的情况下重新加载配置

  •  37
  • Kieran Benton  · 技术社区  · 16 年前

    有人在Web应用程序中使用过这个吗?

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

    我是否注定要重新启动应用程序?我希望这种方法能使我找到一种更有效的解决方案。

    更新:

    通过“重新加载”,我的意思是刷新configurationManager.appSettings,而不必完全重新启动ASP.NET应用程序,并且必须产生通常的启动延迟。

    10 回复  |  直到 8 年前
        1
  •  47
  •   G-Wiz RameshVel    11 年前

    确保通过正确的 case sensitive 刷新部分的值,即

    ConfigurationManager.RefreshSection("appSettings");
    
        2
  •  13
  •   Adam    16 年前

    当为AppSettings使用外部配置文件时,这似乎是一个缺陷(可能是一个bug)。我尝试过使用configSource属性,而refreshSection根本不起作用,我假设在使用file属性时也是这样。 如果你把你的appsettings移回web.config的refreshsection中,会很好地工作,但否则我担心你会完蛋。

        3
  •  4
  •   Willem van Ketwich    12 年前

    出于某种原因 ConfigurationManager.RefreshSection("appSettings") 不是为我工作。将web.config重新加载到配置对象中似乎可以正常工作。下面的代码假定web.config文件是Executing(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;
    
        4
  •  3
  •   Martin Meixger    13 年前

    作为另一种选择,你可以自己写 ConfigSection 并设置 restartOnExternalChanges="false" .

    然后,在阅读本节时 ConfigurationManager.GetSection("yourSection") 设置将是 自动刷新而不重新启动应用程序 .

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

        5
  •  1
  •   Allie    8 年前

    .refreshSection()在AppSettings为外部时不工作。

    但是,可以使用以下命令更改值:

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

        6
  •  0
  •   yamspog    15 年前

    对。您无法重新启动IIS。

    ASP.NET 4.0和IIS 7.5中有一个功能,它删除了初始启动。

        7
  •  0
  •   badpanda    15 年前

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

        8
  •  -1
  •   Seibar    16 年前

    当应用程序启动时,app.config设置缓存在内存中。因为这个原因,我认为你不需要重新启动应用程序就无法更改这些设置。另一个非常直接的选择是创建一个单独的、简单的XML配置文件,并自己处理加载/缓存/重新加载。

        9
  •  -1
  •   C. Ross trotttrotttrott    15 年前

    要写作,请这样称呼:

    dim config as system.configuration.configuration=system.web.configuration.webconfigurationmanager.openwebconfiguration(“~”)

    返回addorupdatappsetting(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
    
        10
  •  -2
  •   Vince    15 年前

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