परिचय: एक सवाल जो हर .NET डेवलपर को परेशान करता है
\n\nक्या आपने कभी सोचा है कि जब आप ConfigurationManager.AppSettings["myKey"] लिखते हैं तो वास्तव में क्या होता है? ज़्यादातर डेवलपर इसे बस मान लेते हैं: लाइन लिखी, वैल्यू मिल गई। लेकिन अगर आप थोड़ा गहराई में जाएँ (और Stack Overflow पर एक लोकप्रिय सवाल पढ़ने के बाद हर जिज्ञासु दिमाग यही करता है), तो आप पाएँगे कि इस सरल कॉल के पीछे एक पूरी मशीनरी छिपी है।
इस लेख में हम सिर्फ़ यह नहीं दिखाएँगे कि C# में app.config या web.config से सेटिंग्स कैसे पढ़ी जाती हैं। हम 'हुड के नीचे' झाँकेंगे: समझेंगे कि .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 - वैल्यू पार्स करना।
keyऔरvalueएट्रीब्यूट वाले प्रत्येक चाइल्ड एलिमेंट<add>को की-वैल्यू पेयर में बदलकरNameValueCollectionमें रखा जाता है। \n - कैशिंग। रिज़ल्ट कैश हो जाता है।
ConfigurationManager.AppSettingsको दोबारा कॉल करने पर फ़ाइल दोबारा नहीं पढ़ी जाती — यह कैश से डेटा लेता है। \n
एक महत्वपूर्ण बारीकी: कैशिंग और बदलाव
\n\nअगर आप एप्लिकेशन चलने के दौरान app.config बदलते हैं, तो ConfigurationManager.AppSettings इन बदलावों को नहीं देखेगा, जब तक कि एप्लिकेशन डोमेन रीलोड न हो जाए। यह बग्स के सबसे आम कारणों में से एक है: "मैंने सेटिंग्स बदल दीं, लेकिन प्रोग्राम अब भी पुरानी वैल्यू का उपयोग कर रहा है!"
कॉन्फ़िगरेशन को जबरदस्ती रीपढ़ने के लिए, आप ConfigurationManager.RefreshSection("appSettings") का उपयोग कर सकते हैं, लेकिन यह एक समाधान से ज़्यादा एक पैच है।
3. सेक्शन हैंडलर: कस्टम सेक्शन
\n\nआपने शायद देखा होगा कि web.config में सिर्फ़ appSettings ही नहीं, बल्कि system.web, system.net और अन्य भी होते हैं। ऐसे प्रत्येक सेक्शन को अपने सेक्शन हैंडलर द्वारा प्रोसेस किया जाता है — एक क्लास जो