asp.net - Comment définir des sections web.config personnalisées avec des éléments enfants potentiels et des attributs pour les propriétés?

Translate

Les applications Web que je développe nécessitent souvent des paramètres de configuration co-dépendants et il y a aussi des paramètres qui doivent changer lorsque nous nous déplaçons entre chacun de nos environnements.

Tous nos paramètres sont actuellement de simples paires clé / valeur, mais il serait utile de créer des sections de configuration personnalisées afin qu'il soit évident lorsque deux valeurs doivent changer ensemble ou lorsque les paramètres doivent changer pour un environnement.

Quelle est la meilleure façon de créer des sections de configuration personnalisées et y a-t-il des considérations spéciales à prendre lors de la récupération des valeurs?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Utilisation d'attributs, de sections de configuration enfant et de contraintes

Il existe également la possibilité d'utiliser des attributs qui prennent automatiquement en charge la plomberie, ainsi que la possibilité d'ajouter facilement des contraintes.

Je présente ici un exemple de code que j'utilise moi-même dans l'un de mes sites. Avec une contrainte, je dicte la quantité maximale d'espace disque qu'un utilisateur est autorisé à utiliser.

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

Ceci est configuré dans web.config comme ceci

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

Éléments enfants

L'élément xml enfantcourrierest créé dans le même fichier .cs que celui ci-dessus. Ici, j'ai ajouté des contraintes sur le port. Si le port se voit attribuer une valeur ne faisant pas partie de cette plage, le runtime se plaindra lorsque la configuration est chargée.

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

Utilisation

Pour ensuite l'utiliser pratiquement dans le code, il suffit d'instancier le MailCenterConfigurationObject, cela vaautomatiquementlisez les sections pertinentes de 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);
}

Vérifier la validité

J'ai mentionné précédemment que le runtime se plaindra lorsque la configuration est chargée et que certaines données ne sont pas conformes aux règles que vous avez définies (par exemple dans MailCenterConfiguration.cs). J'ai tendance à vouloir savoir ces choses le plus tôt possible lorsque mon site démarre. Une façon de résoudre ce problème est de charger la configuration dans _Global.asax.cx.Application_Start_, si la configuration n'est pas valide, vous en serez averti au moyen d'une exception. Votre site ne démarrera pas et à la place, des informations détaillées sur les exceptions vous seront présentées dans leÉcran jaune de la mort.

Global.asax.cs

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

Quick'n Dirty:

Créez d'abord votreConfigurationSectionetConfigurationElementDes classes:

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

Ensuite, indiquez au framework comment gérer vos classes de configuration dansweb.config:

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

Et ajoutez en fait votre propre section ci-dessous:

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

Ensuite, vous pouvez l'utiliser dans votre code ainsi:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
La source
Translate

Il y a un excellentexemple sur MSDNen utilisantConfigurationCollectionet .NET 4.5 pour les sections personnalisées de web.config contenant une liste d'éléments de configuration.

La source
Leona Lee
Translate

La configuration personnalisée est assez pratique et les applications se retrouvent souvent avec une demande pour une solution extensible.

Pour .NET 1.1, veuillez consulter l'articlehttp://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Remarque: la solution ci-dessus fonctionne également pour .NET 2.0.

Pour une solution spécifique à .NET 2.0, veuillez consulter l'articlehttp://aspnet.4guysfromrolla.com/articles/032807-1.aspx

La source
Translate

Vous pouvez accomplir cela avec les gestionnaires de section. Il existe un aperçu de base de la façon d'en écrire unhttp://www.codeproject.com/KB/aspnet/ConfigSections.aspxcependant, il fait référence à app.config qui serait à peu près la même chose que d'en écrire un à utiliser dans web.config. Cela vous permettra essentiellement d'avoir votre propre arborescence XML dans le fichier de configuration et d'effectuer une configuration plus avancée.

La source
Translate

La méthode la plus simple, que j'ai trouvée, utilisesection appSettings.

  1. Ajoutez à Web.config ce qui suit:

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

  2. Accès depuis votre code

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

La source