Modificar la sección de configuración mediante programación en confianza media
-
27-10-2019 - |
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?
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 NameValueCollection
s, 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.