Wie definiere ich benutzerdefinierte web.config Abschnitte mit potentiellen geordneten Elemente und Attribute für die Eigenschaften?

stimmen
59

Die Web-Anwendungen, die ich oft entwickeln erfordern co-abhängige Konfigurationseinstellungen und es gibt auch Einstellungen, die, wie wir zwischen jedem unserer Umgebungen bewegen sich ändern müssen.

Alle unsere Einstellungen sind momentan einfach Schlüssel Wert-Paare, aber es wäre sinnvoll, benutzerdefinierte Konfigurationsabschnitte zu schaffen, so dass es offensichtlich ist, wenn zwei Werte müssen zusammen ändern oder wenn die Einstellungen müssen für eine Umgebung ändern.

Was ist der beste Weg, benutzerdefinierte Konfigurationsabschnitte zu erstellen und sind es spezielle Überlegungen zu machen, wenn die Werte abrufen?

Veröffentlicht am 05/08/2008 um 13:13
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
74

Mit Attribute, untergeordnete Konfigurationsabschnitte und Einschränkungen

Es besteht auch die Möglichkeit, Attribute zu verwenden, die automatisch Pflege der Sanitär nehmen, sowie die Möglichkeit bietet, auf einfache Weise Einschränkungen hinzufügen.

Ich stelle hier ein Beispiel von Code, den ich selbst verwende in einen meiner Seiten. Mit einer Constraint diktieren I 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 wird in web.config auf 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 Mail wird in der gleichen CS - Datei wie die oben erstellt. Hier habe ich hinzugefügt Einschränkungen auf den Hafen. Wenn der Port einen Wert nicht in diesem Bereich zugewiesen wird die Laufzeit wird sich beschweren , wenn die Konfiguration geladen wird.

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; }
        }

Benutzen

Um es dann in Code zu verwenden , praktisch alles, was Sie tun müssen , ist die MailCenterConfigurationObject instanziiert, wird dies automatisch die entsprechenden Abschnitte von web.config lesen.

MailCenterConfiguration.cs

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

        return instance;
    }
}

AnotherFile.cs

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

Überprüfen auf Gültigkeit

Ich erwähnte bereits , dass die Laufzeit wird sich beschweren , wenn die Konfiguration geladen ist und einige Daten entsprechen nicht den Regeln , die Sie eingerichtet haben (zB in MailCenterConfiguration.cs). Ich neige dazu , diese Dinge so schnell wie möglich wissen zu wollen , wenn meine Seite nach oben abfeuert. Eine Möglichkeit , dies zu lösen , ist die Konfiguration in _Global.asax.cx.Application_Start_ laden, wenn die Konfiguration ungültig ist , mit den Mitteln einer Ausnahme hiervon unterrichtet werden. Ihre Website wird nicht gestartet und stattdessen finden Sie ausführliche Informationen zur Ausnahme in dem dargestellt werden Yellow Bildschirm des Todes .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Beantwortet am 05/08/2008 um 23:17
quelle vom benutzer

stimmen
11

Quick'n Schmutzige:

Zuerst Ihre erstellen Configuration und Configuration 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 wissen , wie Sie Ihre Konfigurationsklassen in hand web.config :

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

Und tatsächlich Ihren eigenen Abschnitt hinzufügen unten:

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

Dann können Sie es in Ihrem Code verwenden also:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
Beantwortet am 05/08/2008 um 13:51
quelle vom benutzer

stimmen
4

Es gibt ein hervorragendes Beispiel auf MSDN verwendet ConfigurationCollectionund .NET 4.5 für benutzerdefinierte Abschnitte in web.config , die eine Liste von Konfigurations Elementen haben.

Beantwortet am 19/09/2013 um 16:39
quelle vom benutzer

stimmen
3

Die individuelle Konfiguration ist sehr praktische Sache und oft Anwendungen am Ende mit der Forderung nach einer ausziehbaren Lösung auf.

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

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

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

Beantwortet am 13/02/2009 um 14:45
quelle vom benutzer

stimmen
2

Sie können dies mit § Handlers erreichen. Es gibt einen grundlegenden Überblick darüber , wie man sich schreiben http://www.codeproject.com/KB/aspnet/ConfigSections.aspx aber es app.config bezieht , die ziemlich viel wäre das gleiche wie eine für den Einsatz in Web zu schreiben. Konfig. Auf diese Weise können Sie im Wesentlichen Ihre eigene XML - Struktur in der Konfigurationsdatei haben und einige erweiterte Konfiguration zu tun.

Beantwortet am 05/08/2008 um 13:25
quelle vom benutzer

stimmen
1

Die einfachste Methode, die ich gefunden, wird mit appSettings Abschnitt .

  1. Fügen Sie den folgenden Web.config:

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

  2. Der Zugang aus dem Code

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

Beantwortet am 04/02/2017 um 17:59
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more