Hvordan kan jeg definere tilpassede Web.config seksjoner med potensielle ordnede elementer og attributter for eiendommene?

stemmer
61

Webapplikasjoner jeg utvikler krever ofte co-avhengige konfigurasjonsinnstillinger, og det finnes også innstillinger som må endres etter hvert som vi beveger oss mellom hver av våre omgivelser.

Alle våre innstillinger er nå enkle taste verdi par, men det ville være nyttig å opprette egendefinerte config seksjoner slik at det er tydelig når to verdier må endre sammen eller når innstillingene må endre for et miljø.

Hva er den beste måten å lage egne config seksjoner, og er det noen spesielle hensyn å ta når du henter verdiene?

Publisert på 05/08/2008 klokken 12:13
kilden bruker
På andre språk...                            


6 svar

stemmer
75

Ved hjelp av attributter, barn config seksjoner og begrensninger

Det er også mulighet for å bruke attributter som automatisk tar seg av avløp, samt gi muligheten til enkelt å legge begrensninger.

Jeg her presentere et eksempel fra kode jeg bruker meg selv i en av mine nettsteder. Med en begrensning diktere jeg den maksimale mengden av diskplass hvilket som helst bruker har lov til å bruke.

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

Dette er satt opp i web.config som så

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

ordnede elementer

Barnet xml element post opprettes i samme .CS filen som den ovenfor. Her har jeg lagt begrensninger på porten. Hvis porten er tildelt en verdi som ikke i dette området kjøretids vil klage når konfigurasjons er lastet.

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

Bruk

Å deretter bruke det praktisk talt i kode, alt du trenger å gjøre instantiate MailCenterConfigurationObject, vil dette automatisk lese de aktuelle delene fra 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);
}

Sjekk for gyldighet

Jeg har tidligere nevnt at kjøretiden vil klage når konfigurasjonen er lastet og noen data ikke overholder reglene du har satt opp (for eksempel i MailCenterConfiguration.cs). Jeg har en tendens til å ønske å vite disse tingene så snart som mulig når min side fyrer opp. En måte å løse dette er å laste konfigurasjonen i _Global.asax.cx.Application_Start_, hvis konfigurasjonen er ugyldig du vil bli varslet om dette med hjelp av et unntak. Nettstedet vil ikke starte, og i stedet vil du bli presentert detaljert unntak opplysninger i Yellow skjermen av død .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Svarte 05/08/2008 kl. 22:17
kilden bruker

stemmer
12

Quick'n Dirty:

Først lage dine ConfigurationSection og ConfigurationElement klasser:

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

Deretter la rammene vet hvordan de skal håndtere konfigurasjons klasser i web.config :

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

Og faktisk legge til dine egne avsnitt nedenfor:

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

Deretter kan du bruke den i koden slik:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
Svarte 05/08/2008 kl. 12:51
kilden bruker

stemmer
5

Det er en utmerket eksempel på MSDN hjelp ConfigurationCollectionog .NET 4.5 for tilpassede deler i web.config som har en liste over config elementer.

Svarte 19/09/2013 kl. 15:39
kilden bruker

stemmer
4

Skikken konfigurasjon er ganske hendig ting og ofte programmer ende opp med et behov for et utvid løsning.

For .NET 1.1 henvises artikkelen http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Merk: Ovennevnte løsning som fungerer for .NET 2.0 også.

For .NET 2.0 spesifikk løsning, se artikkelen http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Svarte 13/02/2009 kl. 13:45
kilden bruker

stemmer
3

Du kan oppnå dette med § Handlers. Det er en grunnleggende oversikt over hvordan du skriver en på http://www.codeproject.com/KB/aspnet/ConfigSections.aspx men det refererer til app.config som ville være ganske mye det samme som å skrive en for bruk i nettet. config. Dette vil tillate deg å egentlig ha din egen XML tre i config-filen og gjøre noe mer avansert konfigurasjon.

Svarte 05/08/2008 kl. 12:25
kilden bruker

stemmer
2

Den enkleste metode, som jeg funnet, blir det ved hjelp av appSettings seksjon .

  1. Legg til Web.config følgende:

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

  2. Tilgang fra koden din

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

Svarte 04/02/2017 kl. 17:59
kilden bruker

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