Recarregar a configuração sem reiniciar o aplicativo usando o ConfigurationManager.RefreshSection

StackOverflow https://stackoverflow.com/questions/179254

Pergunta

Alguém conseguiu isso funcionando em um aplicativo da web?

Não importa o que eu faça, parece que minha seção AppSettings (redirecionada do web.config usando o AppSettings file = ". Sitity site.config") não é recarregado.

Estou condenado ao caso de ter que apenas reiniciar o aplicativo? Eu esperava que esse método me levasse a uma solução mais performante.

Atualizar:

'Recarregar', quero dizer, refrescante ConfigurationManager.AppSettings sem precisar reiniciar completamente meu aplicativo ASP.NET e ter que incorrer na latência usual de inicialização.

Foi útil?

Solução

Certifique -se de que você está passando o correto maiúsculas e minúsculas valor para refrescar, ou seja,

ConfigurationManager.RefreshSection("appSettings");

Outras dicas

Isso parece ser uma falha (talvez um bug) ao usar um arquivo de configuração externo para suas AppSettings. Eu tentei usando o atributo ConfigSource e o RefreshSection simplesmente nunca funciona, estou assumindo que isso seja o mesmo ao usar o atributo de arquivo. Se você mover suas apps.

Por algum motivo ConfigurationManager.RefreshSection("appSettings") não estava funcionando para mim. Recarregar o web.config em um objeto de configuração parece funcionar corretamente. O código a seguir assume que o arquivo web.config é um diretório abaixo da pasta Execução (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); 

E é usado como:

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

Como alternativa, você pode escrever o seu próprio ConfigSection E definir restartOnExternalChanges="false".

Então, ao ler a seção com ConfigurationManager.GetSection("yourSection") As configurações serão refrescada automaticamente sem reinicialização do aplicativo.

E você pode implementar suas configurações fortemente digitadas ou como NameValuEcollection.

.RefreshSection () não funciona quando as AppSettings são externas.

No entanto, você pode usar o seguinte para alterar um valor:

ConfigurationManager.AppSettings.Set(key, value)

Isso não alterará a configuração em arquivo, apenas o valor carregado na memória.

Então, em vez de usar o RefreshSection, fiz o seguinte:

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);
}

Quaisquer chamadas subsequentes para appSettings.get conterão o valor atualizado.

As AppSettings serão atualizadas sem a necessidade de reiniciar o aplicativo.

Sim. Você está preso com o IIS reiniciando.

Existe um recurso no ASP.NET 4.0 e IIS 7.5, onde a inicialização inicial é removida.

Não tenho certeza se isso é possível em um aplicativo da Web, mas funciona em um aplicativo de desktop. Tente usar o Configurationsettings em vez do ConfigurationManager (ele gritará com você por usar aulas desatualizadas ...) e depois ler todos os dados em uma classe. Quando você deseja atualizar, basta criar uma nova instância e soltar todas as referências à instância antiga. Minha teoria por que isso funciona (pode estar errado): quando você não acessa diretamente o arquivo app.config o tempo todo em que está executando, o bloqueio de arquivo é descartado pelo aplicativo. Em seguida, as edições podem ser feitas quando você não está acessando o arquivo.

As configurações do app.config são armazenadas em cache na memória quando o aplicativo é iniciado. Por esse motivo, acho que você não poderá alterar essas configurações sem reiniciar seu aplicativo. Uma alternativa que deve ser bastante direta seria criar um arquivo de configuração XML simples e separado e manipular o carregamento/cache/recarregamento.

Para escrever, ligue daqui:

Dim Config como System.configuration.configuration = System.web.configuration.webconfigurationmanager.openwebconfiguration ("~")

Retorne AddorUpDateAppSetting (config, "yourSettingKey", "yourvalueforthekey")

Para ler e verifique se você obtém os valores no arquivo, em vez dos em cache, leia -o desta maneira:

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

Exemplo completo:

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

Você já tentou armazenar suas appsettings em seu próprio arquivo externo?

De app.config/web.config:

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

AppSsettings.config:

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

Alterações feitas no appSettings.config devem ser refletidas instantaneamente. Mais informações:http://msdn.microsoft.com/en-us/library/system.configuration.sectionInformation.configsource.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top