Accueil > .Net, C#, Développement > [C#] Lire les (groupes de) sections d’un fichier App.Config

[C#] Lire les (groupes de) sections d’un fichier App.Config

Dans un précédent billet, [Sécurité] Chiffrer les données de configuration, nous avons vu comment crypter les données d’un fichier de configuration.

Mais toutes les sections ne sont pas éligibles.
Si vous vous souvenez bien, il y a plusieurs niveaux de configurations.
Outre le fichier App.Config, il y a aussi et avant tout le fichier Machine.Config, situé (par exemple) dans le répertoire suivant :

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config

Les deux fichiers sont donc fusionnés et, lorsque l’on ouvre (via code) le fichier de configuration de l’application, il y a toutes les sections des deux.
Mais dans le cas du chiffrement du fichier de configuration de l’application, il n’y a pas forcément intérêt à chiffrer aussi le fichier Machine.Config (ça reste sur la même machine, donc on peut supposer que le chiffrement du fichier Machine.Config soit sans incidence).

Du coup, comment choisir, via code, les sections à chiffrer ?

 
C’est la question que je me suis posé quand j’ai fais une petite application pour gérer le chiffrement des App.Config et Web.Config (je la mettrais peut-être à disposition, si j’en ai l’autorisation, du fait que c’est fait dans le cadre de mon travail).

Quand on charge un fichier de configuration, on a accès à pas mal de renseignements.
Pour rappel :

Configuration config = ConfigurationManager.OpenExeConfiguration(configPath);

 

Récupérer les sections

 

Dans la propriété ConfigurationFile.Sections.Keys, on peut avoir toutes les sections.
Dans le cas de mon application de test, ça donne tout ça :
App Config 01

On va dire que dans le tas, y en a pas énorme qui m’intéresse.
En fait, il n’y en a que deux : appSettings et connectionStrings.
Comment les différencier ?

C’est là que je ne suis pas certain, je ne m’appuie sur rien d’autres que des observations.
Mais sur chaque section, il y a une propriété :

List<ConfigurationSection> sectionsName = new List<ConfigurationSection>();
// Parcourir toutes les sections
for (int i = 0; i < config.Sections.Keys.Count; i++)
{
    try
    {
        // Récupérer les sections pour les mettre dans une liste
        // Cette boucle est présente pour la "securité" car peut occasionner une exception ConfigurationErrorsException
        // sur certaines sections (ie: non chargées dans le AppDomain, entre autres) raisons
        sectionsName.Add(config.ConfigurationFile.Sections[i]);
    }
    catch (ConfigurationErrorsException)
    {
    }
}
// Récupérer tous les noms de sections du App.Config
List<string> sections = sectionsName
                             .Where(c => c.SectionInformation.RequirePermission == false)
                             .Select(c => c.SectionInformation.Name);

Je ne suis pas certain du SectionInformation.RequirePermission.
Mais en procédant ainsi, j’ai bien que les deux sections qui m’intéressent… à savoir appSettings et connectionStrings.

Si vous avez un autre moyen, je suis preneur.

 

Récupérer les groupes sections

 

Dans certains cas, il est intéressant de faire des sections de configuration personnalisées.
Pour savoir comment faire, se reporter là : How to: Create Custom Configuration Sections Using ConfigurationSection.

Voici le code que j’ai utilisé :

List<ConfigurationSectionGroup> groupsName = new List<ConfigurationSectionGroup>();
List<ConfigurationSection> groupsSectionName = new List<ConfigurationSection>();
// Parcourir les groupes de sections
for (int i = 0; i < config.SectionGroups.Keys.Count; i++)
{
    try
    {
        // Récupérer les sections pour les mettre dans une liste (même raison que précédemment)
        groupsName.Add(config.SectionGroups[i]);
    }
    catch (ConfigurationErrorsException)
    {
    }
}

// Former le nom des sections (ie: group/section)
groupsName
        .Where(c => c.Type == null)
        .ToList()
        .ForEach(csg =>
        {
            for (int i = 0; i < csg.Sections.Keys.Count; i++)
            {
                sections.Add(string.Format(@"{0}/{1}", csg.Name, csg.Sections.Keys[i]));
            }
        });

Là non plus, je ne suis pas certain que ce soit la meilleure manière de faire, mais en l’absence d’autres pistes, celle-là fonctionne.

 

Conclusion

 

Maintenant, la liste « sections » contient tous les noms de sections qui peuvent être utilisés sur le

config.GetSection(sections[0]);

Voilà, même si ce billet ne s’appuie que sur des spéculations (et donc est potentiellement faillible ; je n’ai pas trouvé / assez cherché), j’espère qu’il pourra aider.

Catégories :.Net, C#, Développement
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :