Hoe definieer ik aangepaste web.config secties met potentiële kind elementen en attributen voor de eigenschappen?

stemmen
59

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

Al onze instellingen zijn eenvoudig belangrijke waarde paren, maar het zou nuttig zijn om aangepaste config secties te creëren, zodat het duidelijk is wanneer twee waarden samen moeten wijzigen of wanneer de instellingen moeten veranderen voor een omgeving.

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

De vraag is gesteld op 05/08/2008 om 13:13
bron van user
In andere talen...                            


6 antwoorden

stemmen
2

U kunt dit doen met sectie Handlers. Er is een basis overzicht van hoe u een op te schrijven http://www.codeproject.com/KB/aspnet/ConfigSections.aspx maar het verwijst naar app.config die vrijwel hetzelfde als het schrijven van een voor gebruik in web zou zijn. config. Zo kunt u in wezen uw eigen XML-structuur in het configuratiebestand en doe wat meer geavanceerde configuratie.

antwoordde op 05/08/2008 om 13:25
bron van user

stemmen
11

Quick'n Dirty:

Maak eerst uw ConfigurationSection en 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];
        }
    }
}

Dan laat het kader weet hoe u uw configuratie lessen behandelen in web.config :

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

En eigenlijk onder voeg uw eigen sectie:

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

Dan kunt u deze gebruiken in uw code als volgt:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
antwoordde op 05/08/2008 om 13:51
bron van user

stemmen
74

Met behulp van attributen, kind config secties en beperkingen

Er is ook de mogelijkheid om attributen die automatisch zorgt voor de sanitair, alsmede het verschaffen van de mogelijkheid om eenvoudig beperkingen toe te voegen gebruiken.

Ik hier presenteren een voorbeeld van code Zelf gebruik ik in een van mijn sites. Met een beperking dicteren I de maximale hoeveelheid schijfruimte 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 opstelling in web.config zoals zo

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

Onderliggende elementen

Het kind xml element mail wordt gemaakt in het bestand dezelfde .cs als hierboven. Hier heb ik beperkingen op de haven toegevoegd. Als de poort geen waarde is toegekend in dit gebied 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 gebruik het dan praktisch in de code, alles wat je hoeft te doen is instantiëren de MailCenterConfigurationObject, zal dit automatisch de relevante hoofdstukken uit web.config.

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

Geldigheid te controleren

Ik al eerder gezegd dat de runtime zal klagen wanneer de configuratie is geladen en sommige gegevens niet voldoet aan de regels die u hebt ingesteld (bijvoorbeeld in MailCenterConfiguration.cs). Ik heb de neiging om te willen weten deze dingen zo snel mogelijk wanneer mijn site branden up. 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 op de hoogte gesteld van de middelen van een uitzondering. Uw site zal niet starten en je in plaats daarvan zal worden gepresenteerd gedetailleerde uitzondering informatie in het Yellow screen of death .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
antwoordde op 05/08/2008 om 23:17
bron van user

stemmen
3

De aangepaste configuratie zijn heel handig ding en vaak toepassingen eindigen met een vraag naar een uitschuifbare oplossing.

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

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

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

antwoordde op 13/02/2009 om 14:45
bron van user

stemmen
4

Er is een uitstekend voorbeeld van MSDN gebruiken ConfigurationCollectionen .NET 4.5 voor aangepaste onderdelen in web.config dat een lijst van config items heeft.

antwoordde op 19/09/2013 om 16:39
bron van user

stemmen
1

De eenvoudigste methode, die bleek, gebruikt appSettings sectie .

  1. Voeg toe aan de volgende web.config:

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

  2. Toegang vanaf uw code

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

antwoordde op 04/02/2017 om 17:59
bron van user

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