Sei que essa pergunta é antiga, mas gostaria de postar uma resposta com base no estado atual das coisas no mundo ASP.NET \ IIS combinado com minha experiência no mundo real.
Recentemente, liderei um projeto em minha empresa em que queria consolidar e gerenciar todas as configurações de appSettings e connectionStrings em nossos arquivos web.config em um local central. Eu queria seguir uma abordagem em que nossas configurações fossem armazenadas no ZooKeeper devido à maturidade e estabilidade desse projeto. Sem mencionar o fato de que o ZooKeeper é por design um aplicativo de gerenciamento de configuração e cluster.
Os objetivos do projeto eram muito simples;
- faça o ASP.NET se comunicar com o ZooKeeper
- em Global.asax, Application_Start - extraia as configurações web.config do ZooKeeper.
Depois de passar pela parte técnica de fazer o ASP.NET falar com o ZooKeeper, rapidamente descobri e bati na parede com o código a seguir;
ConfigurationManager.AppSettings.Add(key_name, data_value)
Essa declaração fez o sentido mais lógico, pois eu queria ADICIONAR novas configurações à coleção appSettings. No entanto, como o autor da postagem original (e muitos outros) mencionou, essa chamada de código retorna um erro informando que a coleção é somente leitura.
Depois de fazer um pouco de pesquisa e ver todas as maneiras diferentes e malucas com as quais as pessoas contornavam esse problema, fiquei muito desanimado. Em vez de desistir ou se contentar com o que parecia ser um cenário menos do que o ideal, decidi cavar e ver se estava faltando alguma coisa.
Com um pouco de tentativa e erro, descobri que o código a seguir faria exatamente o que eu queria;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Usando esta linha de código, agora consigo carregar todas as 85 chaves appSettings do ZooKeeper em meu Application_Start.
Com relação às declarações gerais sobre as alterações no web.config que acionam as reciclagens do IIS, editei as seguintes configurações de appPool para monitorar a situação nos bastidores;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Com essa combinação de configurações, se esse processo causasse uma reciclagem de appPool, uma entrada do Log de eventos deveria ser registrada, o que não foi.
Isso me leva a concluir que é possível, e de fato seguro, carregar as configurações de um aplicativo a partir de um meio de armazenamento centralizado.
Devo mencionar que estou usando o IIS7.5 no Windows 7. O código será implantado no IIS8 no Win2012. Se algo em relação a essa resposta mudar, atualizarei esta resposta de acordo.