सवाल एप्लिकेशन निर्देशिका फ़ोल्डर के बाहर .NET कॉन्फ़िगर फ़ाइलें configSource


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

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

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

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

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


76
2018-02-20 10:54


मूल




जवाब:


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

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


91
2018-03-28 22:56



हैलो, मुझे यह जवाब पसंद है और मैंने इसे अपने प्रोजेक्ट पर लागू करने का प्रयास किया है, और जब मैं अपने ऐप को "प्रकाशित" करता हूं तो सब कुछ ठीक काम करता है (डीबी.कॉन्फिग जैसा आपने कहा था वेब्रॉट पर कॉपी किया गया है), लेकिन वीएस के माध्यम से डीबगिंग नहीं करते और कैसिनी इसके बजाय मुझे "configSource फ़ाइल 'db.config' अपवाद खोलने में असमर्थ" मिलता है। क्या ऐसा करने में सक्षम होने के लिए मुझे कुछ याद आ रही है? धन्यवाद! - Funka
निस्संदेह मैं मदद करने के लिए एक टिप्पणी लिखने और पोस्ट करने का फैसला करने के ठीक बाद ही मैं इसे बाद में समझता हूं। मैंने देखा कि मेरा db.config है भी / bin / फ़ोल्डर में कॉपी किया गया है, इसलिए मैंने अपने वेब.कॉन्फिग को इस पथ को प्रीपेड करने के लिए अपडेट किया है configSource और सब ठीक लगता है। एक बार फिर धन्यवाद! - Funka
@Funka - अगर आपको समस्या हो रही है तो जांचें क्योंकि आपके db.config की "बिल्ड एक्शन" प्रॉपर्टी डिफ़ॉल्ट वेब.कॉन्फिग जैसी "सामग्री" के बजाय "कोई नहीं" पर सेट है। मेरा मानना ​​है कि सेटिंग्स "बिल्ड एक्शन" = "सामग्री" और "आउटपुट निर्देशिका में कॉपी करें" = "कॉपी न करें" होना चाहिए। - Eric Burcham
काश मैं 10 बार ऊपर उठा सकता है। - Saeed Neamati
यह वीएस 2013 में डीबगिंग करते समय काम नहीं कर रहा है। मैंने एरिक्स समाधान की कोशिश की है और यह भी काम नहीं करता है। - Chris Nevill


ऐप सेटिंग्स के तहत आप config =ource = के बजाय फ़ाइल = का उपयोग कर सकते हैं


29
2017-12-02 17:01



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


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

आप सकता है, हालांकि मैं आपको यकीन नहीं कर रहा हूँ चाहिए, एनटीएफएस हार्डलिंक का उपयोग करें। [पागल grin]


16
2018-02-20 11:03





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

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

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

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


8
2018-02-20 11:01



यह आवश्यक है कि पूरी कॉन्फ़िगरेशन फ़ाइल लोड हो। मुझे केवल ऐप सेटिंग्स और कनेक्शनस्ट्रिंग की आवश्यकता है, बाकी फाइल प्रत्येक एप के लिए अलग है, इसलिए यह समस्या को हल नहीं करती है। - Robert MacLean
पूरी कॉन्फ़िगर सामान्य (स्थैतिक) गुणों द्वारा लोड की जाती है, इसलिए इससे कोई वास्तविक अंतर नहीं होता है। - Richard
साथ ही, आप बस अपने स्वयं के एक्सएमएल प्रारूप का उपयोग कर सकते हैं और इसका नाम एप्लिकेशन कॉन्फ़िगरेशन फाइलों में जोड़ सकते हैं और इसे सीधे पढ़ सकते हैं। - Richard


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

यदि आपको वेब के साथ यह समस्या हो रही है। कॉन्फ़िगर स्वीकृत उत्तर सही है लेकिन केवल विस्तार करने के बाद से यह मुझे खुद को चेहरा-हथेली दे रहा था:

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

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

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

तो आपको इस तरह से संबंधित कॉन्फ़िगरेशन तत्व को परिभाषित करना होगा:

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

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

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


4
2017-07-16 07:25





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


2
2018-02-20 11:01



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


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


2
2018-03-11 11:02





मुझे इस मुद्दे के साथ काफी संघर्ष था, लेकिन मुझे इसके लिए एक अच्छा समाधान मिला: बाहरी विन्यास के साथ परीक्षण रन 

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

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


2
2017-07-27 12:43





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

समाधान: अपने 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

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

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

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


2
2017-08-29 20:21





आप इसका उपयोग कर सकते हैं 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>

0
2017-08-01 19:18