Come faccio a definire sezioni web.config personalizzati con potenziali elementi secondari e gli attributi per le proprietà?

voti
59

Le applicazioni web che sviluppo spesso richiedono impostazioni di configurazione co-dipendenti e ci sono anche le impostazioni che devono cambiare, mentre ci muoviamo tra ciascuno dei nostri ambienti.

Tutte le nostre impostazioni sono attualmente semplici coppie di valori chiave, ma che sarebbe stato utile per creare le sezioni di configurazione personalizzate in modo che sia evidente quando due valori devono cambiare insieme o quando le impostazioni devono cambiare per un ambiente.

Qual è il modo migliore per creare le sezioni di configurazione personalizzati e ci sono considerazioni particolari per rendere quando si recuperano i valori?

È pubblicato 05/08/2008 alle 13:13
fonte dall'utente
In altre lingue...                            


6 risposte

voti
74

Utilizzando gli attributi, le sezioni di configurazione bambino e vincoli

V'è anche la possibilità di utilizzare attributi che provvede automaticamente l'impianto idraulico, oltre a fornire la possibilità di aggiungere facilmente vincoli.

Mi presento qui un esempio dal codice uso io in uno dei miei siti. Con un vincolo Io ordino la quantità massima di spazio su disco qualsiasi utente è autorizzato ad utilizzare.

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

Questo è istituito nel web.config in questo modo

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

elementi figlio

L'elemento figlio xml elettronica viene creata nel file stesso Cs come quello di cui sopra. Qui ho aggiunto i vincoli sulla porta. Se la porta viene assegnato un valore non in questo intervallo il runtime lamentano quando la configurazione viene caricata.

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

Uso

Per poi usarlo praticamente nel codice, tutto quello che dovete fare è un'istanza del MailCenterConfigurationObject, questo sarà automaticamente leggere le sezioni pertinenti da 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);
}

Controllare la validità

Ho già detto che il runtime lamentano quando la configurazione è caricato e alcuni dati non è conforme alle regole che si sono configurati (ad esempio in MailCenterConfiguration.cs). Io tendo a voler sapere queste cose il più presto possibile quando il mio sito spara alto. Un modo per risolvere questo problema è caricare la configurazione nel _Global.asax.cx.Application_Start_, se la configurazione non è valida sarai avvisato di questo con i mezzi di un'eccezione. Il tuo sito non verrà avviato e invece vi si presenterà informazioni sull'eccezione dettagliate nella schermata giallo della morte .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Risposto il 05/08/2008 a 23:17
fonte dall'utente

voti
11

Quick'n sporco:

In primo luogo creare i ConfigurationSection e ConfigurationElement classi:

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

Poi lasciare che il quadro sa come gestire le vostre classi di configurazione nel web.config :

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

E in realtà aggiungere la tua sezione sottostante:

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

Quindi è possibile utilizzare nel codice in tal modo:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
Risposto il 05/08/2008 a 13:51
fonte dall'utente

voti
4

C'è un ottimo esempio su MSDN utilizzando ConfigurationCollectione .NET 4.5 per sezioni personalizzate in web.config che ha un elenco di elementi di configurazione.

Risposto il 19/09/2013 a 16:39
fonte dall'utente

voti
3

La configurazione personalizzata sono cosa molto utile e spesso applicazioni finisce con la richiesta di una soluzione estensibile.

Per .NET 1.1 si veda l'articolo http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Nota: La soluzione di cui sopra lavora per NET 2.0 pure.

Per .NET 2.0 soluzione specifica, consultare l'articolo http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Risposto il 13/02/2009 a 14:45
fonte dall'utente

voti
2

È possibile raggiungere questo obiettivo con gestori di sezione. V'è una panoramica di base di come scrivere una alla http://www.codeproject.com/KB/aspnet/ConfigSections.aspx però si riferisce a app.config che sarebbe più o meno lo stesso che scrivere uno per uso nel web. config. Questo vi permetterà di avere in sostanza il proprio albero di XML nel file di configurazione e fare un po configurazione più avanzata.

Risposto il 05/08/2008 a 13:25
fonte dall'utente

voti
1

Il metodo più semplice, che ho trovato, sta usando la sezione appSettings .

  1. Aggiungere al web.config seguente:

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

  2. L'accesso dal codice

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

Risposto il 04/02/2017 a 17:59
fonte dall'utente

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