Ändern Sie den Konfigurationsabschnitt programmgesteuert in mittlerer Vertrauenswürdigkeit
-
27-10-2019 - |
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?
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 NameValueCollection
s 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.