カスタム設定セクションに任意のXMLを含めることは可能ですか?

.net asp.net
カスタム設定セクションに任意のXMLを含めることは可能ですか?

次のようにASP.NET web.configで構成セクションを定義したとします。

そして、 unknownProperty`なしで MySettings:System.Configuration.ConfigurationSection` *を定義したとします。

using System.Configuration;

namespace MyCompany.MyProject.Configuration
{
    public class MySettings : ConfigurationSection
    {
      public MySettings() { }

      [ConfigurationProperty("knownProperty", DefaultValue="default_value")]
      public string KnownProperty
      {
        get { return (string)this["knownProperty"]; }
      }

      // I'm not defining unknownProperty here on purpose
    }
}

認識できない属性「unknownProperty」について文句を言う設定エラーを取得せずにアプリを実行する方法はありますか?

また、私はそのエラーをキャッチし、それが可能であれば無視する方法で大丈夫だと思います。

言い換えれば、XMLには、バインド先のマッチングタイプで定義されていない属性を持たせる必要があります。 既存の構成APIの範囲内で実行できますか?

  9  0


ベストアンサー

WCFやメンバーシップのようないくつかの組み込みセクションはエラーなしでこれを実行するので、私はそれが可能であると確信しています。 OnDeserializeUnrecognizedAttributeはあなたが必要とすることをしますか?

OnDeserializeUnrecognizedAttribute(string name、string value){オーバーライドされます。
//don't call base to avoid error
}

7


私のweb.config ASPファイルから任意のXML構造を正常に読み取るために、以下のコードを使用しています。 読み取りのみがサポートされていることに注意してください。

システムを使用する。 System.Collections.Genericを使用します。 System.Textを使用します。 System.Configurationを使用します。 System.Xmlを使用します。

/ *このファイルには、カスタムセクションを.Netに保存する方法の例があります。
 *  取得可能な任意のXMLを含むことができるアプリケーション構成ファイル
 *  生のSystem.Xml.XmlNodeとして。 以下の特定の例では、私はできるようにしたかったです。
 *  私がメールを取得するPOPサーバーに関する任意の情報を保存する必要はありません。
 *  ケースごとに特定の設定データを書き込みます。 これは素早く便利です
 *  アプリケーション開発。 * /

/ *設定ファイルのサンプル:


任意の文字列1任意の文字列2 * /

/ *出力例:上記の設定ファイルを使用して以下のコードを実行すると、次のようになります。

[email protected]のカスタムXML __ @ __ mail.domain.com:任意の文字列1 ************ [email protected]のカスタムXML __ @ __ mail.domain.com:
         -  なし -  ************ [email protected]のカスタムXML __ @ __ mail.domain.com:任意の文字列2  - > OtherElementが見つかりました! ************キーを押して終了する

* /

名前空間ConsoleApplication1 {クラスプログラム{static void Main(string [] args){

MailRetrieveConfigurationSection config =(MailRetrieveConfigurationSection)(System.Configuration.ConfigurationManager.GetSection( "MySection / MailRetrieve"));

if(config!= null){foreach(config.Hosts内のHostConfigElement cfg){System.Console.WriteLine( "" cfg.PopMailboxID "のカスタムXML:"); if(cfg.RawXml.Node!= null){System.Console.WriteLine(cfg.RawXml.Node.OuterXml); if(cfg.RawXml.Node.SelectSingleNode( "OtherElement")!= null){Console.WriteLine( " - > OtherElement!"); else {System.Console.WriteLine( " -  none  - "); System.Console.WriteLine( "************"); System.Console.WriteLine( "終了するにはキーを押してください"); System.Console.ReadKey(); }}

パブリッククラスMailRetrieveConfigurationSection:ConfigurationSection {[ConfigurationProperty( "Hosts")]パブリックMailRetrieveHostsConfigCollectionホスト{get {return((MailRetrieveHostsConfigCollection)(base ["Hosts"]))); }}}

[ConfigurationCollectionAttribute(typeof(HostConfigElement))]パブリッククラスMailRetrieveHostsConfigCollection:ConfigurationElementCollection {プロテクトオーバーライドConfigurationElement CreateNewElement(){return新しいHostConfigElement(); }

/// /// POPメールボックスごとに設定を1つだけにしたい。ホストのユーザー名をキーにする。///さらに設定が必要な場合は、「id」属性を導入する必要がある。 ///プロテクトオーバーライドオブジェクトGetElementKey(ConfigurationElement element){return((HostConfigElement)(element))。PopMailboxID; }

public void Add(HostConfigElement element){this.BaseAdd(element);} }

public void Remove(string key){this.BaseRemove(key); }

public void Clear(){this.BaseClear(); }

public HostConfigElement this [int idx] {get {return(HostConfigElement)this [idx];} }}}

パブリッククラスMyCustomConfigurationElement:ConfigurationElement {

public XmlNode Node = null。

保護されたオーバーライドvoid DeserializeElement(XmlReaderリーダー、bool serializeCollectionKey){XmlDocument doc = new XmlDocument(); doc.Load(reader.ReadSubtree()); Node = doc.FirstChild; }}

パブリッククラスHostConfigElement:ConfigurationElement {

/// /// POP3メールボックスは、サーバー名とユーザー名を使用して他と区別されます。 /// public string PopMailboxID {get {returnユーザー名 "__ @ __" PopServer; //}}

[ConfigurationProperty( "popserver"、DefaultValue = ""、IsRequired = true)]パブリック文字列PopServer {get {return(string)this ["popserver"]; set {this ["popserver"] = value;} }}

[ConfigurationProperty( "username"、IsRequired = true、Options = ConfigurationPropertyOptions.IsKey)] public stringユーザー名{get {return(string)this ["username"]; set {this ["username"] = value;} }}

[ConfigurationProperty( "password"、DefaultValue = ""、IsRequired = true)] public string Password {get {return(string)this ["password"]; set {this ["password"] = value;} }}

[ConfigurationProperty( "RawXml"、IsRequired = false)] public MyCustomConfigurationElement RawXml {get {return(MyCustomConfigurationElement)this ["RawXml"]; set {this ["RawXml"] = value; }}

}}

2


ダニエルの答えから続く: –

保護されたオーバーライドbool OnDeserializeUnrecognizedAttribute(文字列名、文字列値){try {var lProperty = new ConfigurationProperty(name、typeof(String));} Properties.Add(lプロパティ); base [name] = value; trueを返します。 } catch {falseを返します。 }}

2


タイトルとURLをコピーしました