Cum definesc secțiunile web.config personalizate cu potențiale elemente copil și atribute pentru proprietățile?

voturi
59

Aplicațiile web pe care le dezvolt necesită adesea setări de configurare co-dependente și există, de asemenea, setări care trebuie să se schimbe pe măsură ce avansăm între fiecare dintre mediile noastre.

Toate setările noastre sunt în prezent simple de perechi de valori-cheie, dar ar fi util pentru a crea secțiuni personalizate de configurare, astfel încât este evident atunci când cele două valori trebuie să se schimbe împreună sau când setările trebuie să se schimbe pentru un mediu.

Care este cel mai bun mod de a crea secțiuni de configurare personalizate și sunt acolo orice considerații speciale pentru a face atunci când preluați valorile?

Întrebat 05/08/2008 la 13:13
sursa de către utilizator
În alte limbi...                            


6 răspunsuri

voturi
74

Utilizarea atributelor, secțiuni de configurare pentru copii și constrângeri

Există, de asemenea, posibilitatea de a utiliza atributele care preia automat grijă de instalații sanitare, precum și oferind posibilitatea de a adăuga cu ușurință constrângeri.

Am aici prezint un exemplu de cod mă folosesc într-unul din site-urile mele. Cu o constrângere am dicta cantitatea maximă de spațiu pe disc orice utilizator îi este permis să folosească.

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

Acest lucru este configurat în web.config ca acest lucru

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

elemente pentru copii

Elementul XML copil e - mail este creat în fișierul aceeași .cs ca cea de mai sus. Aici am adăugat constrângeri pe portul. În cazul în care portul se atribuie o valoare nu este în acest interval runtime se va plânge atunci când se încarcă config.

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

Utilizare

Pentru a folosi apoi , practic , în cod, tot ce trebuie să faceți este să instantia MailCenterConfigurationObject, acest lucru se va automat citi secțiunile relevante din 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);
}

Verificați valabilitatea

Am menționat anterior că runtime va plânge atunci când configurația este încărcată , iar unele date nu respectă regulile le - ați configurat ( de exemplu , în MailCenterConfiguration.cs). Am tendința de a dori să știe aceste lucruri cât mai curând posibil , atunci când site - ul meu trage în sus. O modalitate de a rezolva acest lucru este să încărcați configurația în _Global.asax.cx.Application_Start_, în cazul în care configurația este validă , veți fi notificat acest lucru cu mijloacele de excepție. Site - ul dvs. nu va începe și în schimb vă vor fi prezentate informații detaliate excepție în ecranul galben de deces .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Publicat 05/08/2008 la 23:17
sursa de către utilizator

voturi
11

Quick'n murdar:

Mai întâi creați - vă ConfigurationSection și ConfigurationElement clase:

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

Apoi lăsați cadrul știe cum să se ocupe de clase de configurare în web.config :

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

Și, de fapt, adăugați propria secțiune de mai jos:

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

Apoi, puteți utiliza în codul astfel:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
Publicat 05/08/2008 la 13:51
sursa de către utilizator

voturi
4

Există un excelent exemplu pe MSDN folosind ConfigurationCollectionși .NET 4.5 pentru secțiuni personalizate în web.config , care are o listă de elemente de configurare.

Publicat 19/09/2013 la 16:39
sursa de către utilizator

voturi
3

Configurația personalizată sunt destul de lucru la îndemână și de multe ori aplicații se încheie cu o cerere pentru o soluție extensibilă.

Pentru .NET 1.1 vă rugăm să consultați articolul http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Notă: Soluția de mai sus funcționează pentru .NET 2.0, de asemenea.

Pentru .NET 2.0 soluție specifică, vă rugăm să consultați articolul http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Publicat 13/02/2009 la 14:45
sursa de către utilizator

voturi
2

Puteți realiza acest lucru cu secțiunea handlere. Există o prezentare generală de bază a modului de a scrie unul la http://www.codeproject.com/KB/aspnet/ConfigSections.aspx cu toate acestea se referă la app.config care ar fi destul de mult la fel ca unul scris pentru utilizarea în web. config. Acest lucru vă va permite să aibă în esență propriul arbore XML în fișierul de configurare și de a face unele de configurare mai avansate.

Publicat 05/08/2008 la 13:25
sursa de către utilizator

voturi
1

Metoda cea mai simplă, pe care am găsit, folosește secțiunea appSettings .

  1. Adăugați la Web.Config următoarele:

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

  2. Accesul la codul

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

Publicat 04/02/2017 la 17:59
sursa de către utilizator

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