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

StackOverflow https://stackoverflow.com/questions/2155

  •  08-06-2019
  •  | 
  •  

Question

Les applications Web que je développe nécessitent souvent des paramètres de configuration co-dépendants et certains paramètres doivent également changer à mesure que 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 quand 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 particulières à prendre en compte lors de la récupération des valeurs ?

Était-ce utile?

La solution

Utilisation des attributs, des sections de configuration enfants et des contraintes

Il y a aussi la possibilité d'utiliser des attributs qui s'occupent automatiquement de la plomberie, ainsi que 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 enfant mail est 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 qui n'est pas dans cette plage, le moteur d'exécution se plaindra lorsque la configuration sera 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; }
        }

Utiliser

Pour ensuite l'utiliser pratiquement en code, il suffit d'instancier le MailCenterConfigurationObject, cela permettra automatiquement lisez 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;
    }
}

Un autreFichier.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 ex.dans MailCenterConfiguration.cs).J'ai tendance à vouloir connaître ces choses le plus tôt possible lorsque mon site démarre.Une façon de résoudre ce problème consiste à charger la configuration dans _Global.asax.cx.Application_Start_ , si la configuration n'est pas valide, vous en serez informé par le biais d'une exception.Votre site ne démarre pas et 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;
}

Autres conseils

Rapide et sale :

Créez d'abord votre Section Configuration et Élément de configuration Des 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, faites savoir au framework comment gérer vos classes de configuration dans web.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);
}

Il y a un excellent exemple sur MSDN en utilisant ConfigurationCollection et .NET 4.5 pour les sections personnalisées de web.config contenant une liste d'éléments de configuration.

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

Pour .NET 1.1, veuillez vous référer à l'article http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Note:La solution ci-dessus fonctionne également pour .NET 2.0.

Pour une solution spécifique à .NET 2.0, veuillez vous référer à l'article http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Vous pouvez accomplir cela avec les gestionnaires de section.Il y a un aperçu de base de la façon d'en rédiger un sur http://www.codeproject.com/KB/aspnet/ConfigSections.aspx cependant, il fait référence à app.config, ce qui reviendrait à peu près à 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 méthode la plus simple que j'ai trouvée consiste à utiliser Section Paramètres d'application.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top