.NET कॉन्फ़िगरेशन फ़ाइलें एप्लिकेशन डायरेक्टरी फ़ोल्डर के बाहर कॉन्फ़िगर करता है


82

मेरे पास दो एप्लिकेशन हैं एक कंसोल एप्लिकेशन और दूसरा ASP.NET ऐप। उन्हें दोनों को एक ही ऐपसेटिंग और कनेक्शनस्ट्रीम को जानना होगा। तो आदर्श रूप से मैं केंद्रीय स्थान पर इंगित करने के लिए app.config / web.config फ़ाइलों के configSource संपत्ति का उपयोग करना चाहूंगा। उदाहरण के लिए

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

हालांकि यह एक त्रुटि के साथ विफल रहता है:

ConfigSource विशेषता अमान्य है। configSource 'D: \ appSettings.config' अमान्य है। यह उसी निर्देशिका में या कॉन्फ़िगरेशन फ़ाइल के रूप में उपनिर्देशिका में एक फ़ाइल का उल्लेख करना चाहिए।

वैसे भी अभी भी विन्यास प्रबंधकों appSettings / कनेक्शन का उपयोग करने के लिए है और एक बाहरी स्थान से मान मिलता है?
मैं इसे करने के लिए कोड जोड़ने के साथ खुश हूं, लेकिन मैं संपूर्ण कॉन्फ़िगरेशन प्रबंधक सिस्टम को बदलना नहीं चाहता।

जवाबों:


103

एक अन्य समाधान यह है कि आपकी सभी परियोजनाओं में कॉन्फ़िगरेशन फ़ाइल को जोड़ने के लिए एक लिंक के रूप में वास्तव में अपनी परियोजनाओं में फ़ाइल की प्रतिलिपि बनाई जाए। फिर फ़ाइल की "बिल्ड एक्शन" को "कंटेंट" और "आउटपुट निर्देशिका में कॉपी करें" को "कॉपी करें यदि नया है" सेट करें और जब आप प्रोजेक्ट को संकलित करते हैं तो आपके पास आउटपुट निर्देशिका में फ़ाइल होगी।

फ़ाइल को "मौजूदा आइटम जोड़ें" संवाद बॉक्स में एक कड़ी के रूप में जोड़ने के लिए, ड्रॉपडाउन के साथ एक ऐड बटन है। प्रक्रिया को पूरा करने के लिए जोड़ें बटन पर ड्रॉपडाउन से "लिंक के रूप में जोड़ें" चुनें।


लोगों को मेरे तरीके से समझने में बहुत आसान
रॉबर्ट मैकलेन

10
नमस्ते, मुझे यह उत्तर पसंद है और इसे मैंने अपने प्रोजेक्ट में लागू करने की कोशिश की है, और जब मैं अपने ऐप को "प्रकाशित" करता हूं, तो सब कुछ ठीक काम करने लगता है (db.config की प्रतिलिपि वेबरोट में बताई गई है), लेकिन नहीं जब वी.एस. और कासिनी। इसके बजाय मुझे एक "configbource फ़ाइल खोलने में असमर्थ 'db.config' अपवाद मिलता है। क्या ऐसा कुछ है जो मैं ऐसा करने में सक्षम होने के लिए गायब हूं? धन्यवाद!
फनका

16
निश्चित रूप से सही होने के बाद ही मैं टूटने का फैसला करता हूं और एक टिप्पणी पोस्ट करता हूं जिसमें मदद के लिए कहा जाता है। मैंने देखा कि मेरे db.config को भी / bin / folder में कॉपी किया गया है, इसलिए मैंने अपने web.config को इस पथ को आगे बढ़ाने के लिए अपडेट कर दिया है configSourceऔर यह सब ठीक लगता है। एक बार फिर धन्यवाद!
फुनका

1
@ फुनका - जांच करें कि क्या आपको समस्या हो रही है क्योंकि आपके db.config की "बिल्ड एक्शन" संपत्ति डिफ़ॉल्ट वेब की तरह "कंटेंट" के बजाय "कोई नहीं" सेट है। मेरा मानना ​​है कि सेटिंग्स "बिल्ड एक्शन" = "कंटेंट" और "आउटपुट निर्देशिका में कॉपी करें" = "कॉपी न करें।"
bopapa_1979

1
वीएस 2013 में डिबगिंग करते समय यह काम नहीं कर रहा है। मैंने एरिक्सन समाधान की कोशिश की है और यह भी काम नहीं किया।
क्रिस नेविल

34

AppSettings के तहत आप configSource = के बजाय फ़ाइल = का उपयोग कर सकते हैं


1
मेरे लिए बहुत बढ़िया खोज! धन्यवाद!! इस के साथ, मैं AppSettings में चुनिंदा कुंजी के रूप में में दिखाया ओवरराइड कर सकते हैं weblogs.asp.net/pwilson/archive/2003/04/09/5261.aspx
सौरभ कुमार

16

ऐसा लगता है कि यह ऐसा ही है। configSource उसी फ़ोल्डर या गहरे में होना चाहिए।

आप कर सकता है , हालांकि मुझे यकीन नहीं है तो आप चाहिए , एक NTFS hardlink का उपयोग करें। [पागल मुस्कराहट]


10

विजुअल स्टूडियो 2015

यदि आप इस मुद्दे को Web.Config के साथ स्वीकार कर रहे हैं तो सही उत्तर सही है, लेकिन इसका विस्तार करने के लिए, क्योंकि इसने मुझे खुद को फेस-पाम दिया था:

जब आप 'Add As Link' का उपयोग करके अपनी परियोजना में एक .config फ़ाइल जोड़ते हैं और फिर लिंक की प्रतिलिपि गुण को 'कॉपी यदि नया' या 'हमेशा कॉपी करें' सेट करते हैं, तो भौतिक फ़ाइल / बिन फ़ोल्डर में कॉपी हो जाएगी।

इस प्रकार, जब आपके पास Web.Config में इस तरह परिभाषित एक विन्यास अनुभाग है:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

तो आप इस तरह संबंधित विन्यास तत्व को परिभाषित करना चाहिए:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

ऐसा है कि configSource भौतिक बिन \ MySpecialConfig.config फ़ाइल को लिंक करने के लिए इंगित करता है इसके अलावा, ध्यान दें कि पथ एक सापेक्ष भौतिक पथ है।

यह हास्यास्पद रूप से स्पष्ट लग सकता है, लेकिन यदि आपने ऐसा पहले नहीं किया है तो भौतिक फ़ाइल अभी तक \ bin फ़ोल्डर में नहीं है, इसलिए यह तुरंत क्लिक नहीं कर सकता है।


8

आप कॉन्फ़िगरेशन को एक मनमाने स्थान से लोड कर सकते हैं, लेकिन यह कॉन्फ़िगरेशन प्रबंधक के स्थिर गुणों के माध्यम से उपलब्ध नहीं होगा:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(एक अधिभार है जो डिफ़ॉल्ट / उपयोगकर्ता-रोमिंग / उपयोगकर्ता-स्थानीय पदानुक्रम का समर्थन करने के लिए मल्टीपल फ़ाइलों को निर्दिष्ट करने की अनुमति देता है।)

स्थिर गुणों को खोने का मतलब है कि सभी कोड को विभिन्न कॉन्फ़िगरेशन के बारे में पता होना चाहिए।


इसके लिए आवश्यक है कि संपूर्ण कॉन्फ़िग फ़ाइल लोड की जाए। मुझे केवल ऐपसेटिंग और कनेक्शनस्ट्रीम की आवश्यकता है कि एक ही हो, बाकी फ़ाइल प्रत्येक ऐप के लिए अलग है, इसलिए यह समस्या को हल नहीं करता है।
राबर्ट मैकलीन

पूरे विन्यास को सामान्य (स्थिर) गुणों के द्वारा वैसे भी लोड किया जाता है ताकि इससे कोई वास्तविक अंतर न पड़े।
रिचर्ड

इसके अलावा, आप बस अपने स्वयं के XML प्रारूप का उपयोग कर सकते हैं और इसका नाम अनुप्रयोगों की कॉन्फ़िगरेशन फ़ाइलों में जोड़ सकते हैं और इसे सीधे पढ़ सकते हैं।
रिचर्ड

5

कनेक्शन स्ट्रिंग्स के मामले में, एक साझा फ़ाइल को इंगित करना वास्तव में संभव है। यदि साझा फ़ाइल एक नेटवर्क यूएनसी पर है, तो उसे मशीन पर प्रशासनिक विशेषाधिकार की आवश्यकता होती है जहां ऐप को होस्ट किया जाएगा।

समाधान: अपने web.config में, स्थानीय कॉन्फ़िगरेशन फ़ाइल को इंगित करने के लिए configSource का उपयोग करें। .Net प्रतिबंधों के कारण, यह रूट कॉन्फ़िगरेशन फ़ाइल के स्तर पर या उससे नीचे होना चाहिए। मैं केवल ऐप फ़ोल्डर में एक फ़ाइल को इंगित करता हूं:

<connectionStrings configSource="ConnectionStrings.config" />

एक साझा स्थान में जो एप्लिकेशन पूल उपयोगकर्ता द्वारा पहुंच योग्य है, साझा कनेक्शन स्ट्रिंग्स युक्त कॉन्फ़िगरेशन फ़ाइल जोड़ें। इस फ़ाइल में कनेक्शनस्ट्रीमर्स सेक्शन के अलावा कोई भी xml नहीं होना चाहिए। साझा की गई फ़ाइल, ConnectionStrings.config, इस तरह दिखाई देती है:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

अब चाल। बाहरी, साझा कॉन्‍फ़िगर फ़ाइल की ओर इशारा करते हुए अपने ऐप फ़ोल्डर में एक विंडोज प्रतीकात्मक लिंक बनाएं। ऐसा करने के लिए आपको व्यवस्थापक विशेषाधिकारों की आवश्यकता होगी:

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

हमने अभी-अभी आउटसोर्स किया है। नेट। कॉन्फ़िगरेशन सिस्टम कनेक्शन स्ट्रिंग्स को खोजने के लिए configSource सेटिंग का उपयोग करेगा। प्रतीकात्मक लिंक .Net के लिए एक फ़ाइल की तरह दिखता है, और प्रतीकात्मक लिंक साझा कॉन्फ़िगरेशन फ़ाइल में हल होता है।

कैविट्स: साझा की गई फ़ाइल में परिवर्तन स्वचालित रूप से .Net में एक एप्लिकेशन पुनरारंभ को ट्रिगर नहीं करता है। IIS के मामले में, वेब साइट या ऐप पूल को मैन्युअल रूप से पुनरारंभ करने की आवश्यकता होगी।

प्रतीकात्मक लिंक बनाने के लिए प्रशासनिक विशेषाधिकारों की आवश्यकता के कारण, यह दृष्टिकोण हर किसी के लिए काम नहीं कर सकता है। दो संबंधित विकल्प हैं जो काम कर सकते हैं यदि साझा फ़ाइल एक ही तार्किक ड्राइव पर है - हार्ड लिंक और जंक्शन। देखें इस चर्चा और इस चर्चा के बारे में अधिक जानकारी के लिए।


3

आप दोनों सेटिंग्स को मशीन में रख सकते हैं ।config और फिर वे सर्वर पर आपके सभी एप्लिकेशन के लिए उपलब्ध हैं।


यह एक विकल्प है, लेकिन मैं मशीन पर अन्य अनुप्रयोगों के लिए उपलब्ध सेटिंग्स (आवश्यकता) नहीं चाहता। चिंता कनेक्शन के तार हैं, उनके पास बहुत सामान्य नाम हैं जो अन्य अनुप्रयोगों के साथ संघर्ष कर सकते हैं।
रॉबर्ट मैकलेन

2

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


2

मुझे इस मुद्दे के साथ काफी संघर्ष करना पड़ा, लेकिन मुझे इसके लिए एक अच्छा समाधान मिला: बाहरी कॉन्फ़िगरेशन के साथ टेस्ट रन

(आप .testrunconfig फ़ाइल को संपादित करके परीक्षण रन निर्देशिका में फ़ाइलों और निर्देशिकाओं की प्रतिलिपि बनाने के लिए परीक्षण चलाने का निर्देश दे सकते हैं।)

यद्यपि इकाई परीक्षण प्रकार परियोजना अपने स्वयं के app.config से कॉन्फ़िगर सेटिंग्स प्राप्त कर सकती है, लेकिन सामान्य ऐप की तरह संदर्भित फ़ाइल को लोड करने में सक्षम नहीं है ।config मेरे लिए चकरा देने वाला है। मैं इसे एक बग कहूंगा क्योंकि आप परीक्षण प्रोजेक्ट app.config से उसी तरह का व्यवहार करने की अपेक्षा करेंगे, जिस तरह से एप्लिकेशन का एप्लिकेशन ।config व्यवहार करता है, लेकिन यह नहीं है।


1

आप fileइसके बजाय विशेषता का उपयोग कर सकते हैंconfigSource

यहाँ पर एक अच्छा लेख है

यह आपको एक सापेक्ष पथ निर्दिष्ट करने की अनुमति देता है

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

पथ आउटपुट डायरेक्टरी के सापेक्ष है।

फिर ExternalFile.config में आप केवल appSettingsअनुभाग जोड़ें

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.