Pregunta

Tengo una sección de configuración personalizada en mi aplicación:

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; }
    }
}

En mi 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>

Leer la sección funciona bien.El problema que tengo es que cuando leo la sección vía

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

Y luego procedo a modificar el Server propiedad:

   settings.Server = "something";

Esto no modifica la propiedad "Servidor" en el archivo web.config.

Nota:Esto debe funcionar en condiciones de confianza media, por lo que no puedo usarlo. WebConfigurationManager.OpenWebConfiguration que funciona bien.¿Existe una manera explícita de decirle a ConfigSection para salvarse?

¿Fue útil?

Solución

Respuesta corta: no.El equipo de .NET (supuestamente) estaba destinado a solucionar este problema en la versión 4, pero no sucedió.

La razón es porque usar WebConfigurationManager.GetSection devuelve anidado de sólo lectura NameValueCollections, que no persisten cuando cambias sus valores.Usando WebConfigurationManager.OpenWebConfiguration, como has comprobado correctamente, es la única forma de obtener acceso de lectura y escritura a la configuración, pero luego obtendrás un FileIOPermission excepción lanzada, como OpenWebConfiguration intenta cargar todas las configuraciones heredadas en su web.config, que incluye los archivos web.config y machine.config a nivel de máquina en C:\WINDOWS\Microsoft.NET\Framework, que están explícitamente fuera del alcance de Medium Trust.

Respuesta larga: usar XDocument / XmlDocument y XPath para obtener/establecer valores de configuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top