Einleitung: Eine Frage, die jeden .NET-Entwickler quält
\n\nHaben Sie sich jemals gefragt, was tatsächlich passiert, wenn Sie ConfigurationManager.AppSettings["myKey"] schreiben? Die meisten Entwickler nehmen es einfach als gegeben hin: Zeile geschrieben – Wert erhalten. Aber wenn Sie etwas tiefer graben (und das tut jeder wissbegierige Geist nach dem Lesen einer populären Frage auf Stack Overflow), werden Sie einen ganzen Mechanismus entdecken, der hinter diesem einfachen Aufruf verborgen liegt.
In diesem Artikel zeigen wir nicht nur, wie man Einstellungen aus app.config oder web.config in C# liest. Wir schauen „unter die Haube": Wir analysieren, wie das .NET Framework XML parst, welche Klassen an diesem Prozess beteiligt sind und warum Ihre Einstellungen manchmal nicht gelesen werden (Spoiler: Nicht nur der Cache ist schuld).
\n\nWenn Sie jemals in die Situation geraten sind, dass ConfigurationManager.AppSettings["ConnectionString"] null zurückgibt, obwohl die Konfigurationsdatei daneben liegt – dieser Artikel ist für Sie.
1. Grundlagen: Struktur der Konfigurationsdatei
\n\nBevor wir uns in die Tiefen stürzen, erinnern wir uns daran, wie eine typische app.config (oder web.config) aussieht. Alles beginnt mit dem Wurzelelement <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\nDiese XML-Datei ist nicht nur eine Ansammlung von Zeichenfolgen. Es ist eine streng typisierte Struktur, die .NET auf besondere Weise interpretiert. Und hier beginnt das Interessante.
\n\n2. Wie ConfigurationManager funktioniert: Vom Aufruf zum Ergebnis
\n\nWenn Sie ConfigurationManager.AppSettings["ApiUrl"] aufrufen, geschieht folgende Ereigniskette:
- \n
- Bestimmung der Konfigurationsdatei. Das System ermittelt, welche Datei genau gelesen werden soll. Für eine Anwendung ist dies
YourApp.exe.config(neben der exe), für eine Webanwendung dieweb.configim Stammverzeichnis. Wenn die Datei nicht existiert, wird eine leere Sammlung zurückgegeben. \n - Laden des XML. Die Datei wird als XML-Dokument gelesen. Verwendet wird
System.Xml.XmlDocumentoder der effizientereXmlReader(abhängig von der .NET-Version). \n - Suche des Abschnitts. Es wird nach dem Element
<configuration>gesucht, dann darin nach<appSettings>. \n - Parsen der Werte. Jedes untergeordnete Element
<add>mit den Attributenkeyundvaluewird in ein Schlüssel-Wert-Paar umgewandelt und in einerNameValueCollectionabgelegt. \n - Caching. Das Ergebnis wird zwischengespeichert. Ein erneuter Aufruf von
ConfigurationManager.AppSettingsliest die Datei nicht erneut – er bezieht die Daten aus dem Cache. \n
Wichtige Nuance: Caching und Änderungen
\n\nWenn Sie die app.config während der Laufzeit der Anwendung ändern, wird ConfigurationManager.AppSettings diese Änderungen nicht sehen, solange die Anwendungsdomäne nicht neu geladen wird. Dies ist eine der häufigsten Ursachen für Fehler: „Ich habe die Einstellungen geändert, aber das Programm verwendet immer noch die alten!".
Um die Konfiguration zwangsweise neu zu lesen, können Sie ConfigurationManager.RefreshSection("appSettings") verwenden, aber das ist eher ein Workaround als eine Lösung.
3. Abschnittshandler: Benutzerdefinierte Abschnitte
\n\nIhnen ist wahrscheinlich aufgefallen, dass es in der web.config nicht nur appSettings gibt, sondern auch system.web, system.net und andere. Jeder dieser Abschnitte wird von einem eigenen Abschnittshandler verarbeitet – einer Klasse, die