Ich weiß, dass diese Frage alt ist, aber ich wollte eine Antwort veröffentlichen, die auf dem aktuellen Stand der Dinge in der ASP.NET \ IIS-Welt in Kombination mit meiner realen Erfahrung basiert.
Ich habe kürzlich ein Projekt in meinem Unternehmen geleitet, in dem ich alle Einstellungen für appSettings & connectionStrings in unseren web.config-Dateien an einem zentralen Ort konsolidieren und verwalten wollte. Ich wollte einen Ansatz verfolgen, bei dem unsere Konfigurationseinstellungen aufgrund der Reife und Stabilität des Projekts in ZooKeeper gespeichert wurden. Ganz zu schweigen von der Tatsache, dass ZooKeeper eine Konfigurations- und Clusterverwaltungsanwendung ist.
Die Projektziele waren sehr einfach;
- Lassen Sie ASP.NET mit ZooKeeper kommunizieren
- In Global.asax, Application_Start - ziehen Sie die Einstellungen für web.config aus ZooKeeper.
Nachdem ich die technische Aufgabe erhalten hatte, ASP.NET dazu zu bringen, mit ZooKeeper zu sprechen, fand ich schnell eine Wand mit dem folgenden Code und traf sie.
ConfigurationManager.AppSettings.Add(key_name, data_value)
Diese Aussage war am logischsten, da ich der appSettings-Sammlung neue Einstellungen hinzufügen wollte. Wie im Originalposter (und vielen anderen) erwähnt, gibt dieser Codeaufruf jedoch einen Fehler zurück, der besagt, dass die Sammlung schreibgeschützt ist.
Nachdem ich ein bisschen recherchiert und all die verschiedenen verrückten Arten gesehen hatte, wie Menschen dieses Problem umgingen, war ich sehr entmutigt. Anstatt aufzugeben oder mich mit einem weniger als idealen Szenario zufrieden zu geben, beschloss ich, mich zu vertiefen und zu sehen, ob mir etwas fehlte.
Mit ein wenig Versuch und Irrtum stellte ich fest, dass der folgende Code genau das tun würde, was ich wollte;
ConfigurationManager.AppSettings.Set(key_name, data_value)
Mit dieser Codezeile kann ich jetzt alle 85 appSettings-Schlüssel von ZooKeeper in meinen Application_Start laden.
In Bezug auf allgemeine Aussagen zu Änderungen an web.config, die IIS-Recycling auslösen, habe ich die folgenden appPool-Einstellungen bearbeitet, um die Situation hinter den Kulissen zu überwachen.
appPool-->Advanced Settings-->Recycling-->Disable Recycling for Configuration Changes = False
appPool-->Advanced Settings-->Recycling-->Generate Recycle Event Log Entry-->[For Each Setting] = True
Wenn dieser Prozess mit dieser Kombination von Einstellungen einen AppPool-Recycling verursachen sollte, sollte ein Ereignisprotokolleintrag aufgezeichnet worden sein, was nicht der Fall war.
Dies lässt mich zu dem Schluss kommen, dass es möglich und tatsächlich sicher ist, Anwendungseinstellungen von einem zentralen Speichermedium zu laden.
Ich sollte erwähnen, dass ich IIS7.5 unter Windows 7 verwende. Der Code wird unter Win2012 auf IIS8 bereitgestellt. Sollte sich etwas in Bezug auf diese Antwort ändern, werde ich diese Antwort entsprechend aktualisieren.