Recarregar a configuração sem reiniciar o aplicativo usando o ConfigurationManager.RefreshSection
-
05-07-2019 - |
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.
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