Изменить раздел конфигурации программно в среднем доверии
-
27-10-2019 - |
Вопрос
У меня есть пользовательские конфигурации в моем приложении:
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; }
}
}
В моем 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>
Чтение раздела работает нормально. Проблема, с которой я сталкиваюсь, заключается в том, что когда я читаю раздел через
var settings = (SettingsSection)WebConfigurationManager.GetSection("mySettingsGroup/Setting");
А потом я приступаю к изменению Server
свойство:
settings.Server = "something";
Это не изменяет свойство «Сервер» в файле Web.config.
Примечание: это необходимо работать в среднем доверии, поэтому я не могу использовать WebConfigurationManager.OpenWebConfiguration
который работает нормально. Есть ли явный способ сказать ConfigSection
чтобы спасти себя?
Решение
Краткий ответ - нет. .Net команда была (якобы) означала исправить это в v4, но этого не произошло.
Причина в том, что использование WebConfigurationManager.GetSection
Возвращает вложенные только для чтения NameValueCollection
S, которые не сохраняются, когда вы меняете свои ценности. С использованием WebConfigurationManager.OpenWebConfiguration
, как вы совершенно справедливо установлены, является единственным способом получения доступа к чтению доступа к конфигурации - но вы получите FileIOPermission
исключение брошено, как OpenWebConfiguration
Попытки загрузить все наследуемые конфиги в зависимости от вашего web.config - которые включают в себя Web.config и Machine.config C:\WINDOWS\Microsoft.NET\Framework
, которые явно не имеют возможности среднего доверия.
Длинный ответ - использование XDocument
/ XmlDocument
и xPath, чтобы получить/установить значения конфигурации.