Je sais que cette question est ancienne, mais je voulais publier une réponse basée sur l'état actuel des choses dans le monde ASP.NET \ IIS combiné à mon expérience du monde réel.
J'ai récemment dirigé un projet dans mon entreprise dans lequel je voulais consolider et gérer tous les paramètres appSettings & connectionStrings dans nos fichiers web.config en un seul endroit central. Je voulais poursuivre une approche où nos paramètres de configuration étaient stockés dans ZooKeeper en raison de la maturité et de la stabilité des projets. Sans oublier que ZooKeeper est par conception une application de gestion de configuration et de cluster.
Les objectifs du projet étaient très simples;
- obtenir ASP.NET pour communiquer avec ZooKeeper
- dans Global.asax, Application_Start - tirez les paramètres web.config de ZooKeeper.
Après avoir passé la partie technique pour obtenir ASP.NET pour parler à ZooKeeper, j'ai rapidement trouvé et frappé un mur avec le code suivant;
ConfigurationManager.AppSettings.Add(key_name, data_value)
Cette déclaration avait le sens le plus logique puisque je voulais AJOUTER de nouveaux paramètres à la collection appSettings. Cependant, comme l'affiche d'origine (et bien d'autres) l'a mentionné, cet appel de code renvoie une erreur indiquant que la collection est en lecture seule.
Après avoir fait un peu de recherche et vu toutes les différentes façons folles dont les gens travaillaient autour de ce problème, j'étais très découragée. Au lieu d'abandonner ou de me contenter de ce qui semblait être un scénario loin d'être idéal, j'ai décidé de creuser et de voir si je manquais quelque chose.
Avec un peu d'essais et d'erreurs, j'ai trouvé que le code suivant ferait exactement ce que je voulais;
ConfigurationManager.AppSettings.Set(key_name, data_value)
En utilisant cette ligne de code, je suis maintenant en mesure de charger les 85 clés appSettings de ZooKeeper dans mon Application_Start.
En ce qui concerne les déclarations générales sur les modifications apportées à web.config déclenchant le recyclage d'IIS, j'ai modifié les paramètres appPool suivants pour surveiller la situation dans les coulisses;
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Avec cette combinaison de paramètres, si ce processus devait provoquer un recyclage appPool, une entrée du journal des événements aurait dû être enregistrée, ce qui n'était pas le cas.
Cela m'amène à conclure qu'il est possible, et en fait sûr, de charger les paramètres d'une application à partir d'un support de stockage centralisé.
Je dois mentionner que j'utilise IIS7.5 sur Windows 7. Le code sera déployé sur IIS8 sur Win2012. En cas de changement concernant cette réponse, je mettrai à jour cette réponse en conséquence.