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

StackOverflow https://stackoverflow.com/questions/4841977

Вопрос

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

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 Возвращает вложенные только для чтения NameValueCollectionS, которые не сохраняются, когда вы меняете свои ценности. С использованием WebConfigurationManager.OpenWebConfiguration, как вы совершенно справедливо установлены, является единственным способом получения доступа к чтению доступа к конфигурации - но вы получите FileIOPermission исключение брошено, как OpenWebConfiguration Попытки загрузить все наследуемые конфиги в зависимости от вашего web.config - которые включают в себя Web.config и Machine.config C:\WINDOWS\Microsoft.NET\Framework, которые явно не имеют возможности среднего доверия.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top