Modificare la sezione di configurazione a livello di codice con attendibilità media
-
27-10-2019 - |
Domanda
Ho una sezione di configurazione personalizzata nella mia applicazione:
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; }
}
}
Nel mio 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 lettura della sezione funziona bene.Il problema che ho riscontrato è che quando ho letto la sezione tramite
var settings = (SettingsSection)WebConfigurationManager.GetSection("mySettingsGroup/Setting");
E poi procedo a modificare la proprietà Server
:
settings.Server = "something";
Ciò non modifica la proprietà "Server" nel file web.config.
Nota: deve funzionare con un livello di attendibilità medio, quindi non posso utilizzare WebConfigurationManager.OpenWebConfiguration
che funziona bene.C'è un modo esplicito per dire al ConfigSection
di salvarsi?
Soluzione
Risposta breve: no.Il team .NET doveva (presumibilmente) risolvere questo problema nella v4, ma non è successo.
Il motivo è perché l'utilizzo di WebConfigurationManager.GetSection
restituisce NameValueCollection
nidificati di sola lettura, che non persistono quando si modificano i loro valori.L'utilizzo di WebConfigurationManager.OpenWebConfiguration
, come hai giustamente accertato, è l'unico modo per ottenere l'accesso in lettura e scrittura alla configurazione, ma poi verrà generata un'eccezione FileIOPermission
, poiché OpenWebConfiguration
tenta di caricare tutte le configurazioni ereditate sul tuo web.config- che includono i file web.config e machine.config a livello di macchina in C:\WINDOWS\Microsoft.NET\Framework
, che sono esplicitamente fuori dall'ambito di Medium Trust.
Risposta lunga: utilizza XDocument
/ XmlDocument
e XPath per ottenere / impostare i valori di configurazione.