Introduction : Une question qui hante chaque développeur .NET
\n\nAvez-vous déjà réfléchi à ce qui se passe réellement lorsque vous écrivez ConfigurationManager.AppSettings["myKey"] ? La plupart des développeurs acceptent cela comme une évidence : on écrit une chaîne, on obtient une valeur. Mais si vous creusez un peu plus profondément (et c'est exactement ce que fait tout esprit curieux après avoir lu une question populaire sur Stack Overflow), vous découvrirez tout un mécanisme caché derrière cet appel simple.
Dans cet article, nous ne montrerons pas simplement comment lire les paramètres depuis app.config ou web.config en C#. Nous regarderons « sous le capot » : nous analyserons comment le .NET Framework analyse le XML, quelles classes participent à ce processus, et pourquoi parfois vos paramètres ne sont pas lus (spoiler : le cache n'est pas le seul responsable).
\n\nSi vous avez déjà rencontré une situation où ConfigurationManager.AppSettings["ConnectionString"] retourne null alors que le fichier de configuration se trouve à côté — cet article est pour vous.
1. Les bases : Structure du fichier de configuration
\n\nAvant de plonger dans les détails, rappelons à quoi ressemble un app.config typique (ou web.config). Tout commence avec l'élément racine <configuration> :
<?xml version="1.0" encoding="utf-8" ?>\n<configuration>\n <appSettings>\n <add key="ApiUrl" value="https://api.example.com"/>\n <add key="TimeoutSeconds" value="30"/>\n </appSettings>\n <connectionStrings>\n <add name="MainDb" connectionString="Server=.;Database=MyDb;Trusted_Connection=true;"/>\n </connectionStrings>\n</configuration>\n\nCe fichier XML n'est pas simplement un ensemble de chaînes. C'est une structure fortement typée que .NET interprète d'une manière particulière. Et c'est là que les choses deviennent intéressantes.
\n\n2. Comment fonctionne ConfigurationManager : de l'appel au résultat
\n\nLorsque vous appelez ConfigurationManager.AppSettings["ApiUrl"], la chaîne d'événements suivante se produit :
- \n
- Détermination du fichier de configuration. Le système détermine quel fichier lire exactement. Pour une application, c'est
YourApp.exe.config(situé à côté de l'exe), pour une application web —web.configà la racine. Si le fichier n'existe pas, une collection vide est retournée. \n - Chargement du XML. Le fichier est lu comme un document XML. On utilise
System.Xml.XmlDocumentou unXmlReaderplus efficace (selon la version de .NET). \n - Recherche de la section. On cherche l'élément
<configuration>, puis à l'intérieur —<appSettings>. \n - Analyse des valeurs. Chaque élément enfant
<add>avec les attributskeyetvalueest converti en une paire clé-valeur et placé dans uneNameValueCollection. \n - Mise en cache. Le résultat est mis en cache. Un appel répété à
ConfigurationManager.AppSettingsne relit pas le fichier — il prend les données du cache. \n
Nuance importante : mise en cache et modifications
\n\nSi vous modifiez app.config pendant l'exécution de l'application, ConfigurationManager.AppSettings ne verra pas ces modifications tant que le domaine d'application n'est pas rechargé. C'est l'une des causes les plus fréquentes de bugs : « J'ai changé les paramètres, mais le programme utilise toujours les anciens ! ».
Pour forcer la relecture de la configuration, on peut utiliser ConfigurationManager.RefreshSection("appSettings"), mais c'est plus un pansement qu'une solution.
3. Gestionnaires de sections : sections personnalisées
\n\nVous avez probablement remarqué que dans web.config, il n'y a pas seulement appSettings, mais aussi system.web, system.net et d'autres. Chacune de ces sections est traitée par son propre gestionnaire de section — une classe qui