Hoe definieer ik aangepaste web.config-secties met mogelijke onderliggende elementen en attributen voor de eigenschappen?

De webapplicaties die ik ontwikkel, vereisen vaak co-afhankelijke configuratie-instellingen en er zijn ook instellingen die moeten veranderen als we tussen elk van onze omgevingen schakelen.

Al onze instellingen zijn momenteel eenvoudige sleutel-waardeparen, maar het zou handig zijn om aangepaste configuratiesecties te maken, zodat het duidelijk is wanneer twee waarden samen moeten worden gewijzigd of wanneer de instellingen voor een omgeving moeten worden gewijzigd.

Wat is de beste manier om aangepaste configuratiesecties te maken en zijn er speciale overwegingen bij het ophalen van de waarden?


Antwoord 1, autoriteit 100%

Kenmerken, onderliggende configuratiesecties en beperkingen gebruiken

Er is ook de mogelijkheid om attributen te gebruiken die automatisch voor het sanitair zorgen, evenals de mogelijkheid om gemakkelijk beperkingen toe te voegen.

Ik presenteer hier een voorbeeld van code die ik zelf gebruik op een van mijn sites. Met een beperking dicteer ik de maximale hoeveelheid schijfruimte die een gebruiker mag gebruiken.

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

Dit is zo ingesteld in web.config

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

Kinderelementen

Het onderliggende xml-element mailwordt gemaakt in hetzelfde .cs-bestand als hierboven. Hier heb ik beperkingen voor de poort toegevoegd. Als aan de poort een waarde wordt toegewezen die niet in dit bereik ligt, zal de runtime klagen wanneer de configuratie wordt 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; }
        }

Gebruik

Om het vervolgens praktisch in code te gebruiken, hoeft u alleen maar het MailCenterConfigurationObject te instantiëren, dit zal automatischde relevante secties van web.config lezen.

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

Controleer op geldigheid

Ik heb eerder vermeld dat de runtime zal klagen wanneer de configuratie wordt geladen en sommige gegevens niet voldoen aan de regels die u hebt ingesteld (bijvoorbeeld in MailCenterConfiguration.cs). Ik heb de neiging om deze dingen zo snel mogelijk te weten wanneer mijn site opstart. Een manier om dit op te lossen is het laden van de configuratie in _Global.asax.cx.Application_Start_ , als de configuratie ongeldig is wordt u hiervan op de hoogte gesteld met behulp van een uitzondering. Uw site start niet en in plaats daarvan krijgt u gedetailleerde informatie over uitzonderingen te zien in de Geel scherm van de dood.

Global.asax.cs

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

Antwoord 2, autoriteit 15%

Quick’n Dirty:

Maak eerst uw klassen ConfigurationSectionen ConfigurationElement:

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

Laat het framework vervolgens weten hoe het met uw configuratieklassen moet omgaan in web.config:

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

En voeg je eigen sectie hieronder toe:

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

Dan kun je het als volgt in je code gebruiken:

MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection;
if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}

Antwoord 3, autoriteit 6%

Er is een uitstekend voorbeeld op MSDNmet ConfigurationCollectionen .NET 4.5 voor aangepaste secties in web.config met een lijst met configuratie-items.


Antwoord 4, autoriteit 5%

De aangepaste configuratie is best handig en vaak eindigen applicaties met de vraag naar een uitbreidbare oplossing.

Raadpleeg voor .NET 1.1 het artikel http://aspnet.4guysfromrolla.com /articles/020707-1.aspx

Opmerking: de bovenstaande oplossing werkt ook voor .NET 2.0.

Voor een .NET 2.0-specifieke oplossing, raadpleeg het artikel http://aspnet. 4guysfromrolla.com/articles/032807-1.aspx


Antwoord 5, autoriteit 4%

U kunt dit bereiken met sectiehandlers. Er is een basisoverzicht van het schrijven van een op http://www.codeproject.com /Kb/aspnet/configsections.aspx Nou het verwijst naar app.config dat vrijwel hetzelfde zou zijn als het schrijven van een voor gebruik in web.config. Hiermee kunt u in wezen uw eigen XML-boom in het configuratie-bestand hebben en wat meer geavanceerde configuratie doen.

Other episodes