Модифицируйте раздел конфигурации программно в среднем доверии - PullRequest
3 голосов
/ 30 января 2011

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

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

Это не изменяет свойство "Server" в файле web.config.

Примечание: это должно работать при среднем доверии, поэтому я не могу использовать WebConfigurationManager.OpenWebConfiguration, который работает нормально. Есть ли явный способ сказать ConfigSection о сохранении себя?

1 Ответ

3 голосов
/ 11 февраля 2011

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

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

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

...