Wie definiere ich benutzerdefinierte web.config-Abschnitte mit Potenzial untergeordneten Elemente und Attribute für die Eigenschaften?

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

  •  08-06-2019
  •  | 
  •  

Frage

Die web-Anwendungen entwickeln, benötigen oft co-abhängigen Konfigurationseinstellungen und es gibt auch Einstellungen, die geändert werden müssen, wie bewegen wir uns zwischen unserer Umgebung.

Alle unsere Einstellungen sind derzeit einfache Schlüssel-Wert-Paare, aber es würde nützlich sein, um erstellen Sie benutzerdefinierte config-Abschnitte, so dass es offensichtlich ist, wenn zwei Werte ändern müssen, zusammen oder wenn Sie die Einstellungen ändern müssen, für eine Umgebung.

Was ist der beste Weg, um erstellen Sie benutzerdefinierte config-Abschnitte und gibt es spezielle überlegungen zu machen, wenn das abrufen von Werten?

War es hilfreich?

Lösung

Über Attribute, untergeordnete config-Abschnitte und Einschränkungen

Es gibt auch die Möglichkeit, verwenden Sie die Attribute, die kümmert sich automatisch um die Sanitär -, sowie die Bereitstellung der Fähigkeit zu leicht fügen Sie Einschränkungen.

Ich habe hier ein Beispiel von code, den ich verwenden Sie mich in einer meiner Seiten.Mit einer Einschränkung, die ich diktieren die maximale Menge an Speicherplatz, die ein Benutzer verwenden darf.

MailCenterConfiguration.cs:

namespace Ani {

    public sealed class MailCenterConfiguration : ConfigurationSection
    {
        [ConfigurationProperty("userDiskSpace", IsRequired = true)]
        [IntegerValidator(MinValue = 0, MaxValue = 1000000)]
        public int UserDiskSpace
        {
            get { return (int)base["userDiskSpace"]; }
            set { base["userDiskSpace"] = value; }
        }
    }
}

Dies eingerichtet ist, im Internet.config wie so

<configSections>
    <!-- Mailcenter configuration file -->
    <section name="mailCenter" type="Ani.MailCenterConfiguration" requirePermission="false"/>
</configSections>
...
<mailCenter userDiskSpace="25000">
    <mail
     host="my.hostname.com"
     port="366" />
</mailCenter>

Untergeordnete Elemente

Das Kind xml-element E-mail erstellt in der gleichen .cs-Datei wie oben.Hier habe ich die Beschränkungen auf die port.Wenn die port ist zugeordnet eine Wert nicht in diesem Bereich die Laufzeit wird sich beschweren, wenn die Konfiguration geladen.

MailCenterConfiguration.cs:

public sealed class MailCenterConfiguration : ConfigurationSection
{
    [ConfigurationProperty("mail", IsRequired=true)]
    public MailElement Mail
    {
        get { return (MailElement)base["mail"]; }
        set { base["mail"] = value; }
    }

    public class MailElement : ConfigurationElement
    {
        [ConfigurationProperty("host", IsRequired = true)]
        public string Host
        {
            get { return (string)base["host"]; }
            set { base["host"] = value; }
        }

        [ConfigurationProperty("port", IsRequired = true)]
        [IntegerValidator(MinValue = 0, MaxValue = 65535)]
        public int Port
        {
            get { return (int)base["port"]; }
            set { base["port"] = value; }
        }

Verwenden

Dann benutze ihn praktisch in die code, alle Sie tun müssen, ist, instanziieren Sie die MailCenterConfigurationObject, wird dies automatisch Lesen Sie die entsprechenden Abschnitte aus dem web.config.

MailCenterConfiguration.cs

private static MailCenterConfiguration instance = null;
public static MailCenterConfiguration Instance
{
    get
    {
        if (instance == null)
        {
            instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter");
        }

        return instance;
    }
}

Anderedatei.cs

public void SendMail()
{
    MailCenterConfiguration conf = MailCenterConfiguration.Instance;
    SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port);
}

Überprüfen Sie die Gültigkeit

Ich habe bereits erwähnt, dass die Laufzeit wird sich beschweren, wenn die Konfiguration geladen ist und einige Daten entspricht nicht den Regeln, die Sie eingerichtet haben (z.B.in MailCenterConfiguration.cs).Ich Neige dazu, zu wollen, zu wissen, diese Dinge, die so schnell wie möglich, wenn Sie meine Website feuert up.Ein Weg, um dieses Problem zu lösen ist, laden Sie die Konfiguration in _Global.asax.cx.Application_Start_ , wenn die Konfiguration ungültig ist, werden Sie informiert, dass mit dem Mittel eine Ausnahme.Ihre Website wird nicht gestartet und stattdessen erhalten Sie detaillierte Informationen über die Ausnahme in der Gelber Bildschirm des Todes.

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}

Andere Tipps

Quick ' N ' Dirty:

Erstellen Sie zuerst Ihre ConfigurationSection und ConfigurationElement Klassen:

public class MyStuffSection : ConfigurationSection
{
    ConfigurationProperty _MyStuffElement;

    public MyStuffSection()
    {
        _MyStuffElement = new ConfigurationProperty("MyStuff", typeof(MyStuffElement), null);

        this.Properties.Add(_MyStuffElement);
    }

    public MyStuffElement MyStuff
    {
        get
        {
            return this[_MyStuffElement] as MyStuffElement;
        }
    }
}

public class MyStuffElement : ConfigurationElement
{
    ConfigurationProperty _SomeStuff;

    public MyStuffElement()
    {
        _SomeStuff = new ConfigurationProperty("SomeStuff", typeof(string), "<UNDEFINED>");

        this.Properties.Add(_SomeStuff);
    }

    public string SomeStuff
    {
        get
        {
            return (String)this[_SomeStuff];
        }
    }
}

Dann lassen Sie den Rahmen weiß zu behandeln, wie Sie Ihre Konfiguration in Klassen web.config:

<configuration>
  <configSections>
    <section name="MyStuffSection" type="MyWeb.Configuration.MyStuffSection" />
  </configSections>
  ...

Und tatsächlich fügen Sie Ihre eigenen Abschnitt unten:

  <MyStuffSection>
    <MyStuff SomeStuff="Hey There!" />
  </MyStuffSection>

Dann können Sie es verwenden in Ihrem code so:

MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection;

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}

Es ist ein ausgezeichnetes Beispiel auf der MSDN-Website Verwendung ConfigurationCollection und .NET 4.5 für benutzerdefinierte Bereiche im web.config, die eine Liste von config-Elemente.

Die benutzerdefinierte Konfiguration sind sehr praktisch und oft Anwendungen, die am Ende mit einem Bedarf für eine erweiterbare Lösung.

Für .NET 1.1 bitte beachten Sie die Artikel http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Hinweis:Die obige Lösung funktioniert für .NET 2.0 als auch.

Für .NET 2.0-spezifische Lösung, entnehmen Sie bitte der Artikel http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Sie können dies mit Abschnitt Handler.Es gibt einen grundlegenden überblick über, wie zu schreiben auf http://www.codeproject.com/KB/aspnet/ConfigSections.aspx aber es bezieht sich auf die app.config, das wäre so ziemlich das gleiche wie das verfassen eines für die Verwendung im web.config.Dies wird Ihnen ermöglichen, im wesentlichen Ihr eigenes XML-Struktur der config-Datei und machen Sie einige erweiterte Konfiguration.

Die einfachste Methode, die ich gefunden habe, ist die Verwendung appSettings-Abschnitt.

  1. Add to Web.config die folgenden:

    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    

  2. Zugang aus deinem code

    NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];
    

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top