webentwicklung-frage-antwort-db.com.de

Wie ändern Sie die web.config-appSettings zur Laufzeit?

Ich bin verwirrt, wie man die app.ettings-Werte von web.config zur Laufzeit ändert. Zum Beispiel habe ich diesen AppSettings-Abschnitt:

<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 die "Homepagedesc" -Taste zur Laufzeit ändern. Ich habe statische Klassen von ConfigurationManager und WebConfigurationManager ausprobiert, aber die Einstellungen sind "schreibgeschützt". Wie ändere ich die appSettings-Werte zur Laufzeit?

UPDATE: Ok, hier bin ich 5 Jahre später. Ich möchte darauf hinweisen, dass die Erfahrung mir gezeigt hat, dass wir keine zur Laufzeit absichtlich bearbeitbare Konfiguration in die Datei web.config einfügen sollten. Stattdessen sollten wir sie in eine separate XML-Datei einfügen, die von den Benutzern unten kommentiert wird. Dies erfordert keine Bearbeitung der Datei web.config, um die App neu zu starten, was zu wütenden Benutzern führt, die Sie anrufen.

79
jerbersoft

Sie müssen WebConfigurationManager.OpenWebConfiguration(): .__ verwenden. Beispiel:

Dim myConfiguration As Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
myConfiguration.ConnectionStrings.ConnectionStrings("myDatabaseName").ConnectionString = txtConnectionString.Text
myConfiguration.AppSettings.Settings.Item("myKey").Value = txtmyKey.Text
myConfiguration.Save()

Ich denke, Sie müssen möglicherweise auch AllowLocation in machine.config einstellen. Dies ist ein boolescher Wert, der angibt, ob einzelne Seiten mithilfe des Elements konfiguriert werden können. Wenn "allowLocation" false ist, kann es nicht in einzelnen Elementen konfiguriert werden. 

Schließlich macht es einen Unterschied, wenn Sie Ihre Anwendung in IIS und Ihr Testbeispiel in Visual Studio ausführen. Die ASP.NET-Prozessidentität ist das Konto IIS, ASPNET oder NETWORK SERVICES (abhängig von der Version IIS).

Möglicherweise müssen Sie ASPNET oder NETWORK SERVICES Modify-Zugriff auf den Ordner gewähren, in dem sich web.config befindet. 

79
Mitch Wheat

Das Ändern der Datei web.config bewirkt im Allgemeinen einen Neustart der Anwendung.

Wenn Sie Ihre Anwendung wirklich benötigen, um ihre eigenen Einstellungen zu bearbeiten, sollten Sie einen anderen Ansatz in Betracht ziehen, z.

24
Joel

Und wenn Sie den Neustart der Anwendung vermeiden möchten, können Sie den Abschnitt appSettings verschieben:

<appSettings configSource="Config\appSettings.config"/>

in eine separate Datei. Und in Kombination mit ConfigurationSaveMode.Minimal

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.Save(ConfigurationSaveMode.Minimal);

sie können den Abschnitt appSettings weiterhin als Speicher für verschiedene Einstellungen verwenden, ohne dass die Anwendung neu gestartet wird und Sie keine Datei mit einem anderen Format verwenden müssen als der normale Abschnitt appSettings.

21

2012 Dies ist eine bessere Lösung für dieses Szenario (getestet mit Visual Studio 2008 ):

Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);
config.AppSettings.Settings.Remove("MyVariable");
config.AppSettings.Settings.Add("MyVariable", "MyValue");
config.Save();

Update 2018 =>
Getestet in 2015 - Asp.net MVC5 

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
config.Save();

Wenn Sie das Vorhandensein eines Elements überprüfen müssen, verwenden Sie diesen Code: 

var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
if (config.AppSettings.Settings["MyVariable"] != null)
{
config.AppSettings.Settings["MyVariable"].Value = "MyValue";
}
else { config.AppSettings.Settings.Add("MyVariable", "MyValue"); }
config.Save();
17
Amin Ghaderi

Ich weiß, dass diese Frage alt ist, aber ich wollte eine Antwort veröffentlichen, die sich auf den aktuellen Stand der Dinge in der ASP.NET\IIS-Welt in Verbindung mit meiner realen Welterfahrung stützt.

Ich habe vor kurzem ein Projekt in meinem Unternehmen geleitet, bei dem ich alle Einstellungen von appSettings & connectionStrings in unseren web.config-Dateien an einem zentralen Ort zusammenführen und verwalten wollte. Ich wollte einen Ansatz verfolgen, bei dem unsere Konfigurationseinstellungen aufgrund der Reife und Stabilität der Projekte in ZooKeeper gespeichert wurden. Ganz zu schweigen davon, dass ZooKeeper eine Konfigurations- und Clusterverwaltungsanwendung ist.

Die Projektziele waren sehr einfach.

  1. holen Sie sich ASP.NET für die Kommunikation mit ZooKeeper
  2. in Global.asax ziehen Sie mit Application_Start die Einstellungen für web.config aus ZooKeeper.

Nachdem ich das technische Stück bekommen hatte, ASP.NET dazu zu bringen, mit ZooKeeper zu sprechen, fand ich schnell eine Wand mit dem folgenden Code.

ConfigurationManager.AppSettings.Add(key_name, data_value)

Diese Aussage machte den logischsten Sinn, seit ich neue Einstellungen zur appSettings-Sammlung hinzufügen wollte. Wie das ursprüngliche Poster (und viele andere) erwähnt, gibt dieser Codeaufruf jedoch einen Fehler zurück, der angibt, dass die Sammlung schreibgeschützt ist. 

Nachdem ich ein wenig recherchiert hatte und die verschiedenen verrückten Möglichkeiten gesehen hatte, mit denen die Leute an diesem Problem arbeiteten, war ich sehr entmutigt. Anstatt aufzugeben oder sich mit einem scheinbar nicht idealen Szenario zufrieden zu geben, entschied ich mich, nachzusehen und zu schauen, ob mir etwas fehlte. 

Mit ein wenig Ausprobieren 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 aus ZooKeeper in meinen Application_Start laden.

Im Hinblick auf allgemeine Aussagen zu Änderungen an web.config, die IIS -Erecycling 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 bei dieser Kombination von Einstellungen ein appPool-Recycling erforderlich ist, sollte ein Eintrag im Ereignisprotokoll aufgezeichnet werden, was jedoch nicht der Fall war.

Dies lässt mich zu dem Schluss kommen, dass es möglich und tatsächlich sicher ist, die Anwendungseinstellungen von einem zentralen Speichermedium zu laden.

Ich sollte erwähnen, dass ich IIS 7.5 unter Windows 7 verwende. Der Code wird unter Win2012 auf IIS 8 bereitgestellt. Sollte sich etwas bezüglich dieser Antwort ändern, werde ich diese Antwort entsprechend aktualisieren. 

12
Sage

Wer mag es direkt auf den Punkt,

In Ihrer Konfig

    <appSettings>

    <add key="Conf_id" value="71" />

  </appSettings>

in Ihrem Code (c #)

///SET
    ConfigurationManager.AppSettings.Set("Conf_id", "whateveryourvalue");
      ///GET              
    string conf = ConfigurationManager.AppSettings.Get("Conf_id").ToString();
3
mzonerz

Versuche dies:

using System;
using System.Configuration;
using System.Web.Configuration;

namespace SampleApplication.WebConfig
{
    public partial class webConfigFile : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //Helps to open the Root level web.config file.
            Configuration webConfigApp = WebConfigurationManager.OpenWebConfiguration("~");
            //Modifying the AppKey from AppValue to AppValue1
            webConfigApp.AppSettings.Settings["ConnectionString"].Value = "ConnectionString";
            //Save the Modified settings of AppSettings.
            webConfigApp.Save();
        }
    }
}
0
Code Alumni