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

voix
59

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

Tous nos paramètres sont actuellement simples paires de valeurs clés, mais il serait utile de créer des sections de configuration personnalisée de sorte qu'il est é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és et sont là des considérations particulières à faire lors de la récupération des valeurs?

Créé 05/08/2008 à 13:13
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
2

Vous pouvez accomplir cela avec la section Handlers. Il y a une vue d' ensemble de la façon d'écrire un à http://www.codeproject.com/KB/aspnet/ConfigSections.aspx mais il fait référence à App.Config qui serait à peu près la même chose que d' écrire un pour une utilisation dans Web. config. Cela vous permettra d'avoir essentiellement votre propre arbre XML dans le fichier de configuration et de faire une configuration plus avancée.

Créé 05/08/2008 à 13:25
source utilisateur

voix
11

Quick'n Sale:

Tout d' abord créer votre ConfigurationSection et ConfigurationElement cours:

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 , laissez le cadre savoir comment gérer vos classes de configuration dans web.config :

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

Et en fait ajouter 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);
}
Créé 05/08/2008 à 13:51
source utilisateur

voix
74

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

Il y a aussi la possibilité d'utiliser des attributs qui se charge automatiquement de la plomberie, ainsi que de fournir la possibilité d'ajouter facilement des contraintes.

Je vous présente ici un exemple de code que je me sers dans un de mes sites. Avec une contrainte je dicte la quantité maximale d'espace disque tout 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 mis en place dans web.config comme si

<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 messagerie est créé dans le même fichier .cs que celui ci - dessus. Ici , j'ai ajouté des contraintes sur le port. Si le port est attribué une valeur non dans cette plage le temps d' exécution se plaindra lorsque la configuration est chargé.

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 utiliser alors pratiquement dans le code, tout ce que vous avez à faire est instancier le MailCenterConfigurationObject, cela automatiquement lu les sections pertinentes du 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érifiez la validité

Je l' ai déjà mentionné que l'exécution se plaindra (par exemple dans MailCenterConfiguration.cs) lorsque la configuration est chargée et certaines données ne se conforme pas aux règles que vous avez mis en place. J'ai tendance à vouloir connaître ces choses le plus rapidement possible lorsque mon site enflamme. Une façon de résoudre ce problème est de charger la configuration dans _Global.asax.cx.Application_Start_, si la configuration est invalide , vous serez informé de cela avec les moyens d'une exception. Votre site ne démarre pas et au lieu vous sera présenté des informations d'exception détaillées dans l' écran jaune de la mort .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Créé 05/08/2008 à 23:17
source utilisateur

voix
3

La configuration personnalisée sont des applications tout à fait chose à portée de main et finissent souvent avec une demande pour une solution extensible.

Pour .NET 1.1 s'il vous plaît consulter l'article http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Remarque: La solution ci-dessus fonctionne pour .NET 2.0 ainsi.

Pour la solution spécifique .NET 2.0, s'il vous plaît consulter l'article http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Créé 13/02/2009 à 14:45
source utilisateur

voix
4

Il y a un excellent exemple sur MSDN à l' aide ConfigurationCollectionet 4.5 .NET pour les sections personnalisées dans web.config qui a une liste d'éléments de configuration.

Créé 19/09/2013 à 16:39
source utilisateur

voix
1

La méthode la plus simple, que je trouve, utilise la section appSettings .

  1. Ajouter à Web.config les éléments suivants:

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

  2. Accès à partir de votre code

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

Créé 04/02/2017 à 17:59
source utilisateur

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