किसी अनियंत्रित स्थान से कॉन्फ़िगरेशन लोड करने के लिए कॉन्फ़िगरेशन प्रबंधक का उपयोग करना


124

मैं एक डेटा एक्सेस घटक विकसित कर रहा हूं जिसका उपयोग ऐसी वेबसाइट में किया जाएगा जिसमें क्लासिक ASP और ASP.NET पृष्ठों का मिश्रण है, और इसकी कॉन्फ़िगरेशन सेटिंग्स को प्रबंधित करने के लिए एक अच्छे तरीके की आवश्यकता है।

मैं एक कस्टम का उपयोग करना चाहता हूं ConfigurationSection, और ASP.NET पृष्ठों के लिए यह बहुत अच्छा काम करता है। लेकिन जब घटक को एक क्लासिक एएसपी पृष्ठ से COM इंटरॉप के माध्यम से बुलाया जाता है, तो घटक एक ASP.NET अनुरोध के संदर्भ में नहीं चल रहा है और इसलिए web.config का कोई ज्ञान नहीं है।

वहाँ एक तरीका है ConfigurationManagerसिर्फ एक अनियंत्रित पथ से विन्यास लोड करने के लिए (जैसे ..\web.configअगर मेरी विधानसभा /binफ़ोल्डर में है) बताने के लिए ? अगर वहाँ है तो मैं सोच रहा हूँ मेरी घटक है कि करने के लिए वापस गिर सकता है, तो डिफ़ॉल्ट ConfigurationManager.GetSectionरिटर्न nullअपने कस्टम अनुभाग के लिए।

इसके लिए किसी अन्य दृष्टिकोण का स्वागत किया जाएगा!


जवाबों:


124

इसे इस्तेमाल करे:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

मैं कैसे प्राप्त कर सकते हैं प्रोग्राम के रूप में strConfigPath मेरी ASP.NET के लिए मूल्य WebForms आवेदन में होस्ट sub.domain.com/virtualDir2 और पथ \ पोर्टल \ APP1 \ वी 2: सी और कॉन्फ़िग फ़ाइल में C: \ पोर्टल \ APP1 \ वी 2 \ web.config ?
किकेनेट

1
@Kiquenet: सवाल का मुद्दा यह है कि strConfigPath एक मनमाना स्थान है। दूसरे शब्दों में, आप यह तय करते हैं कि पथ क्या है, इसके स्थान पर एक कॉन्फ़िगरेशन फ़ाइल को उसके पारंपरिक स्थान से लोड करने का प्रयास करने के लिए ढांचे पर निर्भर होने के बजाय। मुझे लगता है कि Server.MapPath आपको आपके समाधान के भीतर किसी भी फाइल के लिए पूर्ण स्थान देगा।
इस्माईल

1
हो सकता हैvar config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config");
Kiquenet

@Kiquenet निश्चित रूप से।
Ucho

66

एक अन्य समाधान डिफ़ॉल्ट पर्यावरण कॉन्फ़िगरेशन फ़ाइल पथ को ओवरराइड करना है।

मुझे यह गैर-तुच्छ-पथ कॉन्फ़िगरेशन फ़ाइल लोड के लिए सबसे अच्छा समाधान लगता है, विशेष रूप से dll में कॉन्फ़िगरेशन फ़ाइल संलग्न करने का सबसे अच्छा तरीका है।

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

उदाहरण:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

अधिक जानकारी यहां मिल सकती है इस ब्लॉग

इसके अतिरिक्त, इस दूसरे जवाब में एक उत्कृष्ट समाधान है, एप्लिकेशन कॉन्फिगर को रीफ्रेश करने के लिए कोड और IDisposableइसे मूल स्थिति में वापस लाने के लिए ऑब्जेक्ट के साथ पूरा । इस समाधान के साथ, आप अस्थायी एप्लिकेशन कॉन्‍फ़िगर को स्‍कॉप कर सकते हैं:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}

1
यह web.config फ़ाइलों को लोड करने के लिए भी काम करता है। मैं इसे किसी कार्य संबंधित कंसोल ऐप के लिए app.config के बजाय web.config लोड करने के लिए उपयोग करता हूं। ;)
जेम्स विल्किंस

1
यह (और अन्य उत्तर यहां) मेरे लिए काम नहीं करता है। मैंने program.cs - function: Main () में कोड जोड़ा था। मेरे कॉन्‍फ़िगर में असेंबली संस्‍करण पुनर्निर्देशन होता है (देखें stackoverflow.com/questions/30165393/… ), लेकिन रिडायरेक्‍ट उस समय प्रभावित नहीं करता है जब कॉन्‍फ़िगर मैन्युअल रूप से परिवर्तित होता है।
भंवर852456

1
क्या आपने "APP_CONFIG_FILE" का उपयोग किया था?
शनि टेक्नोलॉजीज

40

इश्माईल का जवाब आम तौर पर काम करता है, हालांकि मुझे एक मुद्दा मिला, जो यह है कि OpenMappedMachineConfigurationमशीन से अपने विरासत वाले खंड समूहों को खोना लगता है। इसका मतलब है कि आप अपने स्वयं के कस्टम वर्गों (जो सभी ओपी चाहते थे) तक पहुंच सकते हैं, लेकिन सामान्य सिस्टम अनुभाग नहीं। उदाहरण के लिए, यह कोड काम नहीं करेगा:

ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null

असल में, अगर आप इस पर नजर रखते हैं, तो आप configuration.SectionGroupsदेखेंगे कि system.net एक सेक्शनग्रुप के रूप में पंजीकृत नहीं है, इसलिए यह सामान्य चैनलों के माध्यम से बहुत अधिक दुर्गम है।

इसके आसपास काम करने के दो तरीके हैं। पहला, जो मुझे पसंद नहीं है, उन्हें सिस्टम अनुभाग समूहों को मशीन से कॉपी करके फिर से लागू करना है।

<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </sectionGroup>
</sectionGroup>

मुझे यकीन नहीं है कि वेब एप्लिकेशन खुद उसके बाद सही ढंग से चलेगा, लेकिन आप सेक्शनग्रुप को सही तरीके से एक्सेस कर सकते हैं।

इसके बजाय दूसरा समाधान यह है कि अपने web.config को एक EXE कॉन्फ़िगरेशन के रूप में खोलें, जो संभवतः वैसे भी अपने इच्छित फ़ंक्शन के करीब है:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns valid object!

मैं यहां दिए गए उत्तरों में से किसी का भी साहस नहीं करता, न ही मेरा या ईशमाईल का, इन कार्यों का काफी उपयोग कर रहे हैं। लेकिन, यह मेरे लिए काम करने लगता है।


1
आप उसी उद्देश्य के लिए configurationManager.OpenExeConfiguration (स्ट्रिंग) अधिभार का भी उपयोग कर सकते हैं। देखें: codeproject.com/KB/dotnet/mysteriesofconfiguration3.aspx#t2_1
ओहद श्नाइडर

10

इस्माइल के जवाब के अलावा, विधि OpenMappedMachineConfiguration()हमेशा एक Configurationवस्तु वापस करेगी । इसलिए यह देखने के लिए कि क्या आपने लोड किया है, आपको उस HasFileसंपत्ति की जांच करनी चाहिए जहां सही मायने में यह एक फाइल से आया है।


9

स्वीकृत उत्तर गलत है !!

यह AppSettings संपत्ति तक पहुँचने पर निम्न अपवाद फेंकता है:

'System.Configuration.DefaultSection' टाइप की ऑब्जेक्ट को 'System.Configuration.AppSettingsSection' टाइप करने में असमर्थ।

यहाँ सही समाधान है:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

1
हाँ, यह निश्चित रूप से सही उत्तर है! अपना उत्तर पोस्ट करने के लिए धन्यवाद।
फाबियो मिल्हीरो

मुझे लगता है कि System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration और भी अधिक सही है, लेकिन यह .NET कोर के लिए उपलब्ध नहीं है, इसलिए उस स्थिति में यह उत्तर काम करने के लिए लगता है।
रिस्फोर्ड

4

मैंने होस्ट किए गए शब्द .nET कंपोनेंट को निम्न प्रकार से कॉन्फ़िगरेशन मान प्रदान किए।

एक .NET क्लास लाइब्रेरी घटक जिसे MS Word में कहा जाता है / होस्ट किया जाता है। मेरे घटक को कॉन्फ़िगरेशन मान प्रदान करने के लिए, मैंने C: \ Program Files \ Microsoft Office \ OFFICE11 फ़ोल्डर में winword.exe.config बनाया। आप विन्यास मानों को पढ़ने में सक्षम होना चाहिए जैसे आप पारंपरिक .NET में करते हैं।

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];

1

ASP.NET के लिए WebConfigurationManager का उपयोग करें:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;

0

XML संसाधन का उपयोग करें:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.