كيف يقرأ .NET الإعدادات من app.config تحت الغطاء: تحليل للمتطلعين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: سؤال واحد يقلق كل مطور .NET

\n\n

هل تساءلت يومًا عما يحدث حقًا عندما تكتب ConfigurationManager.AppSettings["myKey"]؟ معظم المطورين يتقبلون الأمر كمسلَّمة: كتبت سطرًا - حصلت على قيمة. ولكن إذا تعمقت قليلاً (وهذا ما يفعله كل عقل فضولي بعد قراءة سؤال شائع على Stack Overflow)، ستكتشف آلية كاملة مخفية خلف هذا الاستدعاء البسيط.

\n\n

في هذه المقالة، لن نعرض فقط كيفية قراءة الإعدادات من app.config أو web.config بلغة C#. سننظر "تحت الغطاء": سنحلل كيف يقوم .NET Framework بتحليل XML، وما هي الفئات المشاركة في هذه العملية، ولماذا لا تُقرأ إعداداتك أحيانًا (تنبيه: ليس التخزين المؤقت هو المسؤول الوحيد).

\n\n

إذا واجهت يومًا موقفًا يعيد فيه ConfigurationManager.AppSettings["ConnectionString"] قيمة null بينما ملف التكوين موجود بجوارك - فهذه المقالة لك.

\n\n

1. الأساسيات: هيكل ملف التكوين

\n\n

قبل الخوض في التفاصيل، دعنا نتذكر كيف يبدو app.config النموذجي (أو web.config). يبدأ كل شيء بالعنصر الجذر <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

ملف XML هذا ليس مجرد مجموعة من السلاسل النصية. إنه هيكل محدد النوع بدقة، يفسره .NET بطريقة خاصة. وهنا يبدأ الجزء المثير للاهتمام.

\n\n

2. كيف يعمل ConfigurationManager: من الاستدعاء إلى النتيجة

\n\n

عند استدعاء ConfigurationManager.AppSettings["ApiUrl"]، تحدث سلسلة الأحداث التالية:

\n\n
    \n
  1. تحديد ملف التكوين. يحدد النظام أي ملف بالضبط سيقرأ. بالنسبة للتطبيق، هو YourApp.exe.config (الموجود بجانب exe)، وبالنسبة لتطبيق الويب - web.config في الجذر. إذا لم يكن الملف موجودًا - يتم إرجاع مجموعة فارغة.
  2. \n
  3. تحميل XML. يُقرأ الملف كمستند XML. يُستخدم System.Xml.XmlDocument أو XmlReader الأكثر كفاءة (حسب إصدار .NET).
  4. \n
  5. البحث عن القسم. يُبحث عن العنصر <configuration>، ثم داخله عن <appSettings>.
  6. \n
  7. تحليل القيم. يتم تحويل كل عنصر فرعي <add> مع السمات key و value إلى زوج مفتاح-قيمة ويوضع في NameValueCollection.
  8. \n
  9. التخزين المؤقت. يتم تخزين النتيجة مؤقتًا. الاستدعاء المتكرر لـ ConfigurationManager.AppSettings لا يعيد قراءة الملف - بل يأخذ البيانات من الذاكرة المؤقتة.
  10. \n
\n\n

فارق مهم: التخزين المؤقت والتغييرات

\n\n

إذا قمت بتغيير app.config أثناء تشغيل التطبيق، لن يرى ConfigurationManager.AppSettings هذه التغييرات حتى يتم إعادة تحميل مجال التطبيق. هذا أحد أكثر أسباب الأخطاء شيوعًا: "لقد غيرت الإعدادات، لكن البرنامج لا يزال يستخدم القديمة!".

\n\n

لإجبار إعادة قراءة التكوين، يمكن استخدام ConfigurationManager.RefreshSection("appSettings")، لكن هذا أشبه بحل مؤقت أكثر من كونه حلاً حقيقياً.

\n\n

3. معالجات الأقسام: الأقسام المخصصة

\n\n

ربما لاحظت أنه في web.config لا يوجد فقط appSettings، بل أيضًا system.web و system.net وغيرها. كل قسم من هذه الأقسام يُعالج بواسطة معالج قسم خاص به - وهو فئة ت

المدونات

توصيات الكتب