3

我的应用程序中有一个自定义 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自己保存?

4

1 回答 1

3

简短的回答 - 不。.NET 团队(据称)打算在 v4 中解决这个问题,但它没有发生。

原因是因为 usingWebConfigurationManager.GetSection返回嵌套的只读NameValueCollections,当您更改它们的值时,它们不会持续存在。正如您已经正确确定的那样,使用WebConfigurationManager.OpenWebConfiguration是获得对配置的读写访问权限的唯一方法 - 但随后您将FileIOPermission抛出异常,因为OpenWebConfiguration尝试将所有继承的配置加载到您的 web.config - 其中包括中的机器级 web.config 和 machine.config 文件C:\WINDOWS\Microsoft.NET\Framework,它们明确超出了中等信任的范围。

长答案 - 使用XDocument/XmlDocument和 XPath 来获取/设置配置值。

于 2011-02-11T09:53:48.657 回答