مقدمة: سؤال واحد يقلق كل مطور .NET
\n\nهل تساءلت يومًا عما يحدث حقًا عندما تكتب ConfigurationManager.AppSettings["myKey"]؟ معظم المطورين يتقبلون الأمر كمسلَّمة: كتبت سطرًا - حصلت على قيمة. ولكن إذا تعمقت قليلاً (وهذا ما يفعله كل عقل فضولي بعد قراءة سؤال شائع على Stack Overflow)، ستكتشف آلية كاملة مخفية خلف هذا الاستدعاء البسيط.
في هذه المقالة، لن نعرض فقط كيفية قراءة الإعدادات من app.config أو web.config بلغة C#. سننظر "تحت الغطاء": سنحلل كيف يقوم .NET Framework بتحليل XML، وما هي الفئات المشاركة في هذه العملية، ولماذا لا تُقرأ إعداداتك أحيانًا (تنبيه: ليس التخزين المؤقت هو المسؤول الوحيد).
\n\nإذا واجهت يومًا موقفًا يعيد فيه ConfigurationManager.AppSettings["ConnectionString"] قيمة null بينما ملف التكوين موجود بجوارك - فهذه المقالة لك.
1. الأساسيات: هيكل ملف التكوين
\n\nقبل الخوض في التفاصيل، دعنا نتذكر كيف يبدو app.config النموذجي (أو web.config). يبدأ كل شيء بالعنصر الجذر <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\nملف XML هذا ليس مجرد مجموعة من السلاسل النصية. إنه هيكل محدد النوع بدقة، يفسره .NET بطريقة خاصة. وهنا يبدأ الجزء المثير للاهتمام.
\n\n2. كيف يعمل ConfigurationManager: من الاستدعاء إلى النتيجة
\n\nعند استدعاء ConfigurationManager.AppSettings["ApiUrl"]، تحدث سلسلة الأحداث التالية:
- \n
- تحديد ملف التكوين. يحدد النظام أي ملف بالضبط سيقرأ. بالنسبة للتطبيق، هو
YourApp.exe.config(الموجود بجانب exe)، وبالنسبة لتطبيق الويب -web.configفي الجذر. إذا لم يكن الملف موجودًا - يتم إرجاع مجموعة فارغة. \n - تحميل XML. يُقرأ الملف كمستند XML. يُستخدم
System.Xml.XmlDocumentأوXmlReaderالأكثر كفاءة (حسب إصدار .NET). \n - البحث عن القسم. يُبحث عن العنصر
<configuration>، ثم داخله عن<appSettings>. \n - تحليل القيم. يتم تحويل كل عنصر فرعي
<add>مع السماتkeyوvalueإلى زوج مفتاح-قيمة ويوضع فيNameValueCollection. \n - التخزين المؤقت. يتم تخزين النتيجة مؤقتًا. الاستدعاء المتكرر لـ
ConfigurationManager.AppSettingsلا يعيد قراءة الملف - بل يأخذ البيانات من الذاكرة المؤقتة. \n
فارق مهم: التخزين المؤقت والتغييرات
\n\nإذا قمت بتغيير app.config أثناء تشغيل التطبيق، لن يرى ConfigurationManager.AppSettings هذه التغييرات حتى يتم إعادة تحميل مجال التطبيق. هذا أحد أكثر أسباب الأخطاء شيوعًا: "لقد غيرت الإعدادات، لكن البرنامج لا يزال يستخدم القديمة!".
لإجبار إعادة قراءة التكوين، يمكن استخدام ConfigurationManager.RefreshSection("appSettings")، لكن هذا أشبه بحل مؤقت أكثر من كونه حلاً حقيقياً.
3. معالجات الأقسام: الأقسام المخصصة
\n\nربما لاحظت أنه في web.config لا يوجد فقط appSettings، بل أيضًا system.web و system.net وغيرها. كل قسم من هذه الأقسام يُعالج بواسطة معالج قسم خاص به - وهو فئة ت