Wie .NET Einstellungen aus app.config unter der Haube liest: Eine Analyse für Wissbegierige

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Eine Frage, die jeden .NET-Entwickler quält

\n\n

Haben 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.

\n\n

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\n

Wenn 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.

\n\n

1. Grundlagen: Struktur der Konfigurationsdatei

\n\n

Bevor 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>:

\n\n
<?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\n

Diese 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\n

2. Wie ConfigurationManager funktioniert: Vom Aufruf zum Ergebnis

\n\n

Wenn Sie ConfigurationManager.AppSettings["ApiUrl"] aufrufen, geschieht folgende Ereigniskette:

\n\n
    \n
  1. 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 die web.config im Stammverzeichnis. Wenn die Datei nicht existiert, wird eine leere Sammlung zurückgegeben.
  2. \n
  3. Laden des XML. Die Datei wird als XML-Dokument gelesen. Verwendet wird System.Xml.XmlDocument oder der effizientere XmlReader (abhängig von der .NET-Version).
  4. \n
  5. Suche des Abschnitts. Es wird nach dem Element <configuration> gesucht, dann darin nach <appSettings>.
  6. \n
  7. Parsen der Werte. Jedes untergeordnete Element <add> mit den Attributen key und value wird in ein Schlüssel-Wert-Paar umgewandelt und in einer NameValueCollection abgelegt.
  8. \n
  9. Caching. Das Ergebnis wird zwischengespeichert. Ein erneuter Aufruf von ConfigurationManager.AppSettings liest die Datei nicht erneut – er bezieht die Daten aus dem Cache.
  10. \n
\n\n

Wichtige Nuance: Caching und Änderungen

\n\n

Wenn 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!".

\n\n

Um die Konfiguration zwangsweise neu zu lesen, können Sie ConfigurationManager.RefreshSection("appSettings") verwenden, aber das ist eher ein Workaround als eine Lösung.

\n\n

3. Abschnittshandler: Benutzerdefinierte Abschnitte

\n\n

Ihnen 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

Blogs

Buchempfehlungen