2009-02-20 9 views
73

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

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

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

The configSource attribute is invalid.: The configSource 'D:\appSettings.config' is invalid. It must refer to a file in the same directory or in a subdirectory as the configuration file.

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

उत्तर

85

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

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

+0

अच्छा - –

+9

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

+13

बेशक केवल एक बार छोड़ने का फैसला करने के बाद और मदद के लिए एक टिप्पणी पोस्ट करने के ठीक बाद मैं इसे बाद में समझता हूं। मैंने देखा कि मेरा db.config _also_/bin/फ़ोल्डर में कॉपी किया गया है, इसलिए मैंने अपने वेब कॉन्फ़िगरेशन को अपने 'configSource' में इस पथ को पूर्ववत करने के लिए अद्यतन किया है और सभी ठीक दिखते हैं। एक बार फिर धन्यवाद! – Funka

2

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

+0

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

7

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

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path) 

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

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

+0

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

+0

पूरी कॉन्फ़िगरेशन सामान्य (स्थैतिक) गुणों द्वारा लोड की जाती है, इसलिए इससे कोई वास्तविक अंतर नहीं होता है। – Richard

+0

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

16

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

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

2

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

29

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

+1

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

2

मैं काफी इस मुद्दे के साथ एक संघर्ष था, लेकिन मैं यहाँ इसके लिए एक अच्छा समाधान पाया: test run with external config

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

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

3

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

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

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

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

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

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

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

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

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

2

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

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

<connectionStrings configSource="ConnectionStrings.config" /> 

एक साझा स्थान कि अनुप्रयोग पूल उपयोगकर्ता द्वारा पहुँचा जा सकता है में, 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 को फ़ाइल की तरह दिखता है, और प्रतीकात्मक लिंक साझा कॉन्फ़िगरेशन फ़ाइल को हल करता है।

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

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

संबंधित मुद्दे