Modifier la section de configuration programme en fiducie moyenne
-
27-10-2019 - |
Question
J'ai un ConfigurationSection personnalisé dans ma demande:
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; }
}
}
Dans mon 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>
La lecture de la section fonctionne très bien. La question que je vais avoir est que lorsque je lis la section via
var settings = (SettingsSection)WebConfigurationManager.GetSection("mySettingsGroup/Setting");
Et puis je passe à modifier la propriété Server
:
settings.Server = "something";
Cela ne modifie pas la propriété "Server" dans le fichier web.config.
Note: Ce doit travailler en moyenne confiance, donc je ne peux pas utiliser WebConfigurationManager.OpenWebConfiguration
qui fonctionne très bien. Est-il un moyen explicite de dire la ConfigSection
de se sauver?
La solution
Courte réponse - non. équipe .NET étaient (soi-disant) destiné à résoudre ce problème en v4, mais il n'a pas eu lieu.
La raison en est parce que l'utilisation revient WebConfigurationManager.GetSection
lecture seule NameValueCollection
s imbriquées, qui ne persistent pas lorsque vous modifiez leurs valeurs. En utilisant WebConfigurationManager.OpenWebConfiguration
, comme vous avez tout à fait à juste titre assuré, est le seul moyen d'obtenir un accès lecture-écriture à la config - mais alors vous aurez une exception FileIOPermission
jeté, comme des tentatives de OpenWebConfiguration
pour charger toutes les configs héritées jusqu'à votre web.config - qui comprennent la machine-niveau web.config et les fichiers machine.config dans C:\WINDOWS\Microsoft.NET\Framework
, qui sont explicitement
Réponse longue -. L'utilisation XDocument
/ XmlDocument
et XPath pour obtenir / définir des valeurs de configuration