एक मनमानी स्थान से कॉन्फ़िगर लोड करने के लिए ConfigManager का उपयोग करना

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

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

ConfigurationManager को केवल मनमाने ढंग से पथ से कॉन्फ़िगरेशन लोड करने का कोई तरीका है (उदाहरण के लिए .. \ web.config अगर मेरी असेंबली / bin में है फ़ोल्डर)? यदि ऐसा है तो मैं सोच रहा हूं कि मेरा घटक उस पर वापस आ सकता है यदि डिफ़ॉल्ट ConfigurationManager.GetSection मेरे कस्टम अनुभाग के लिए null देता है।

इसका कोई अन्य दृष्टिकोण स्वागत होगा!

0
ro fr bn
जोड़ा लेखक Ohad Schneider, स्रोत

7 उत्तर

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

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
0
जोड़ा
@Kiquenet: सवाल का मुद्दा यह है कि strConfigPath एक मनमानी स्थान है। दूसरे शब्दों में, आप तय करें कि पथ क्या है, फ्रेमवर्क पर निर्भर होने के बजाय अपने पारंपरिक स्थान से कॉन्फ़िगरेशन फ़ाइल लोड करने का प्रयास करें। मैं सर्वर मानता हूं। MapPath आपको आपके समाधान के भीतर किसी भी फाइल के लिए पूर्ण स्थान देगा।
जोड़ा लेखक Ishmaeel, स्रोत
मैं अपने एएसपी.NET वेबफॉर्म के लिए sub.domain.com/virtualDir2 और पथ सी: \ पोर्टल \ ऐप 1 \ v2 और कॉन्फ़िगरेशन फ़ाइल सी: \ पोर्टल \ App1 \ v2 \ web.config में?
जोड़ा लेखक Kiquenet, स्रोत
हो सकता है कि var config = System.Web.Configuration.WebConfigurationManager.OpenWebConf & zwnj; iguration ("~ / web.con और zwnj; अंजीर");
जोड़ा लेखक Kiquenet, स्रोत

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

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

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

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


  
    

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

दूसरा समाधान यह है कि यह आपके 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!

मुझे यहां कोई जवाब नहीं दिया गया है, न तो मेरा या इश्मीएल, इन कार्यों का काफी उपयोग कर रहे हैं। .NET डिजाइनरों का इरादा कैसे है। लेकिन, यह मेरे लिए काम करता प्रतीत होता है।

0
जोड़ा
आप उसी उद्देश्य के लिए ConfigurationManager.OpenExe कॉन्फ़िगरेशन (स्ट्रिंग) ओवरलोड का भी उपयोग कर सकते हैं। देखें: codeproject.com/KB/dotnet/mysteriesofconfiguration3.aspx#t2_‌ 1
जोड़ा लेखक Ohad Schneider, स्रोत

एक्सएमएल प्रोसेसिंग का प्रयोग करें:

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

// can call root.Elements(...)
0
जोड़ा

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

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

AppDomain.CurrentDomain.SetData("APP_CONFIG_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
}
0
जोड़ा
क्या आपने "APP_CONFIG_FILE" का उपयोग किया था?
जोड़ा लेखक Saturn Technologies, स्रोत
यह (और यहां अन्य उत्तरों) मेरे लिए काम नहीं करता है। मैंने प्रोग्राम.cs में कोड जोड़ा था - फ़ंक्शन: मुख्य ()। मेरी कॉन्फ़िगरेशन में एक असेंबली संस्करण पुनर्निर्देशन शामिल है ( जोड़ा लेखक Undercover1989, स्रोत
यह web.config फ़ाइलों को लोड करने के लिए भी काम करता है। मैं इसे एक कार्य संबंधित कंसोल ऐप के लिए app.config के बजाय web.config लोड करने के लिए उपयोग करता हूं। ;)
जोड़ा लेखक James Wilkins, स्रोत

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

0
जोड़ा

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

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

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
0
जोड़ा

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

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
0
जोड़ा