Изменить раздел конфигурации программно в среднем доверии

У меня есть пользовательский раздел ConfigurationSection в моем приложении:

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 сохранить себя?


person Omar    schedule 30.01.2011    source источник


Ответы (1)


Краткий ответ - нет. Команда .NET должна была (предположительно) исправить это в версии 4, но этого не произошло.

Причина в том, что использование WebConfigurationManager.GetSection возвращает вложенные NameValueCollection только для чтения, которые не сохраняются при изменении их значений. Использование WebConfigurationManager.OpenWebConfiguration, как вы совершенно правильно установили, является единственным способом получить доступ для чтения и записи к конфигурации, но тогда вы получите исключение FileIOPermission, так как OpenWebConfiguration попытается загрузить все унаследованные конфигурации в ваш файл web.config. - которые включают файлы web.config и machine.config на уровне компьютера в C:\WINDOWS\Microsoft.NET\Framework, которые явно выходят за рамки Medium Trust.

Длинный ответ - используйте XDocument / XmlDocument и XPath для получения/установки значений конфигурации.

person Jamie Howarth    schedule 11.02.2011