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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top