Ich bin verwirrt darüber, wie die appSettings-Werte von web.config zur Laufzeit geändert werden. Zum Beispiel habe ich diesen Abschnitt appSettings:
<appSettings>
<add key="productspagedesc" value="TODO: Edit this default message" />
<add key="servicespagedesc" value="TODO: Edit this default message" />
<add key="contactspagedesc" value="TODO: Edit this default message" />
<add key="aboutpagedesc" value="TODO: Edit this default message" />
<add key="homepagedesc" value="TODO: Edit this default message" />
</appSettings>
Angenommen, ich möchte den Schlüssel "homepagedesc" zur Laufzeit ändern. Ich habe statische Klassen ConfigurationManager und WebConfigurationManager ausprobiert, aber die Einstellungen sind "schreibgeschützt". Wie ändere ich appSettings-Werte zur Laufzeit?
UPDATE: Ok, also hier bin ich 5 Jahre später. Ich möchte darauf hinweisen, dass die Erfahrung mir gezeigt hat, dass wir keine Konfiguration, die absichtlich zur Laufzeit bearbeitet werden kann, in die Datei web.config einfügen sollten, sondern sie in eine separate XML-Datei einfügen sollten, wie einer der Benutzer unten kommentiert hat. Dies erfordert keine Bearbeitung der Datei web.config, um die App neu zu starten, was dazu führt, dass verärgerte Benutzer Sie anrufen.
quelle
Antworten:
Sie müssen Folgendes verwenden
WebConfigurationManager.OpenWebConfiguration()
: Zum Beispiel:Ich denke, Sie müssen möglicherweise auch AllowLocation in machine.config festlegen. Dies ist ein boolescher Wert, der angibt, ob einzelne Seiten mit dem Element konfiguriert werden können. Wenn "allowLocation" false ist, kann es nicht in einzelnen Elementen konfiguriert werden.
Schließlich macht es einen Unterschied, ob Sie Ihre Anwendung in IIS ausführen und Ihr Testbeispiel in Visual Studio ausführen. Die ASP.NET-Prozessidentität ist das IIS-Konto, ASPNET oder NETWORK SERVICES (abhängig von der IIS-Version).
Möglicherweise müssen Sie ASPNET- oder NETZWERKDIENSTLEISTUNGEN gewähren. Ändern Sie den Zugriff auf den Ordner, in dem sich web.config befindet.
quelle
Das Ändern der web.config führt im Allgemeinen zu einem Neustart der Anwendung.
Wenn Sie wirklich benötigen, dass Ihre Anwendung ihre eigenen Einstellungen bearbeitet, sollten Sie einen anderen Ansatz in Betracht ziehen, z. B. die Datenbank der Einstellungen oder das Erstellen einer XML-Datei mit den bearbeitbaren Einstellungen.
quelle
Wenn Sie den Neustart der Anwendung vermeiden möchten, können Sie den
appSettings
Abschnitt verschieben:in eine separate Datei. Und in Kombination mit
ConfigurationSaveMode.Minimal
Sie können den
appSettings
Abschnitt weiterhin als Speicher für verschiedene Einstellungen verwenden, ohne dass die Anwendung neu gestartet wird und ohne dass eine Datei mit einem anderen Format als dem normalen Abschnitt "appSettings" verwendet werden muss.quelle
2012 Dies ist eine bessere Lösung für dieses Szenario (getestet mit Visual Studio 2008 ):
Update 2018 =>
Getestet in vs 2015 - Asp.net MVC5
Wenn Sie überprüfen müssen, ob ein Element vorhanden ist, verwenden Sie diesen Code:
quelle
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;
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.
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;
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.
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.
quelle
Wer mag direkt auf den Punkt,
In Ihrer Konfiguration
in Ihrem Code (c #)
quelle
Versuche dies:
quelle