Ändern Sie den Konfigurationsabschnitt programmgesteuert in mittlerer Vertrauenswürdigkeit

StackOverflow https://stackoverflow.com/questions/4841977

Frage

Ich habe einen benutzerdefinierten Konfigurationsabschnitt in meiner Anwendung:

public class SettingsSection : ConfigurationSection
{
    [ConfigurationProperty("Setting")]
    public MyElement Setting
    {
        get
        {
            return (MyElement)this["Setting"];
        }
        set { this["Setting"] = value; }
    }
}

public class MyElement : ConfigurationElement
{
    public override bool IsReadOnly()
    {
        return false;
    }

    [ConfigurationProperty("Server")]
    public string Server
    {
        get { return (string)this["Server"]; }
        set { this["Server"] = value; }
    }
}

In meiner web.config

  <configSections>
    <sectionGroup name="mySettingsGroup">
      <section name="Setting" 
               type="MyWebApp.SettingsSection"  
               requirePermission="false" 
               restartOnExternalChanges="true"
               allowDefinition="Everywhere"  />
    </sectionGroup>
  </configSections>

  <mySettingsGroup>
    <Setting>
      <MyElement Server="serverName" />
    </Setting>
  </mySettingsGroup>

Das Lesen des Abschnitts funktioniert einwandfrei.Das Problem, das ich habe, ist, dass ich den Abschnitt über lese

var settings = (SettingsSection)WebConfigurationManager.GetSection("mySettingsGroup/Setting");

Und dann ändere ich die Server-Eigenschaft:

   settings.Server = "something";

Dadurch wird die Eigenschaft "Server" in der Datei "web.config" nicht geändert.

Hinweis: Dies muss unter mittlerer Vertrauenswürdigkeit funktionieren, daher kann ich keinen WebConfigurationManager.OpenWebConfiguration verwenden, der einwandfrei funktioniert.Gibt es eine explizite Möglichkeit, den ConfigSection anzuweisen, sich selbst zu speichern?

War es hilfreich?

Lösung

Kurze Antwort - nein.Das .NET-Team sollte (angeblich) dies in Version 4 beheben, aber es ist nicht geschehen.

Der Grund dafür ist, dass die Verwendung von WebConfigurationManager.GetSection verschachtelte schreibgeschützte NameValueCollections zurückgibt, die beim Ändern ihrer Werte nicht bestehen bleiben.Die Verwendung von WebConfigurationManager.OpenWebConfiguration ist, wie Sie zu Recht festgestellt haben, die einzige Möglichkeit, Lese- / Schreibzugriff auf die Konfiguration zu erhalten. Dann wird jedoch eine FileIOPermission-Ausnahme ausgelöst, da OpenWebConfiguration versucht, alle geerbten Konfigurationen in Ihre web.config zu laden- die die Dateien web.config und machine.config auf Maschinenebene in C:\WINDOWS\Microsoft.NET\Framework enthalten, die explizit außerhalb des Bereichs von Medium Trust liegen.

Lange Antwort - Verwenden Sie XDocument / XmlDocument und XPath, um Konfigurationswerte abzurufen / festzulegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top