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 ファイルの "Server" プロパティを変更しません。

注: これは中程度の信頼で動作する必要があるため、WebConfigurationManager.OpenWebConfiguration正常に動作するものは使用できません。ConfigSection自分自身を保存するように指示する明示的な方法はありますか?

4

1 に答える 1

3

簡単な答え-いいえ。.NETチームは(伝えられるところでは)これをv4で修正することを意図していましたが、それは起こりませんでした。

その理由は、を使用するとWebConfigurationManager.GetSectionネストされた読み取り専用が返されNameValueCollection、値を変更しても保持されないためです。正しく確認したように、を使用WebConfigurationManager.OpenWebConfigurationすることが構成への読み取り/書き込みアクセスを取得する唯一の方法ですが、継承されたすべての構成をweb.configにロードしようとすると、FileIOPermission例外がスローされます。OpenWebConfigurationのマシンレベルのweb.configファイルとmachine.configファイルはC:\WINDOWS\Microsoft.NET\Framework、明示的にMediumTrustの範囲外です。

長い答え- XDocument/XmlDocumentとXPathを使用して構成値を取得/設定します。

于 2011-02-11T09:53:48.657 に答える