वहाँ web.config परिवर्तन का उपयोग कर एक "बदलें या सम्मिलित करें" करने के लिए कोई रास्ता नहीं है?


183

मैं नीचे दिए गए पोस्ट में वर्णित के अनुसार web.config रूपांतरण का उपयोग कर रहा हूं ताकि विभिन्न वातावरणों के लिए कॉन्फ़िगरेशन उत्पन्न हो सके।

http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html

मैं कुंजी पर मेल करके "बदलें" परिवर्तन कर सकता हूं, जैसे

<add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />

और मैं "सम्मिलित" कर सकता हूँ

<add key="UseLivePaymentService" value="true" xdt:Transform="Insert" />

लेकिन जो मुझे वास्तव में उपयोगी लगेगा , वह है रिप्लेसमेंट इनफॉर्मेशन ट्रांसफॉर्मेशन, क्योंकि मैं हमेशा मूल कॉन्फिग फाइल पर निर्भर नहीं रह सकता / रही हूं, जिसमें एक निश्चित कुंजी नहीं है।

क्या इसे करने का कोई तरीका है?


आपके द्वारा दिया गया लिंक अब तक काम नहीं कर रहा है। क्या आपके पास अवधारणा को आसानी से समझने के लिए कोई अन्य लिंक है?
आशीष-बेजोवियल

@AishishJain लिंक मेरे लिए ठीक काम करता है
क्रिस हैन्स

जवाबों:


105

मुझे एक सस्ता वर्कआउट मिला। यह बहुत सुंदर नहीं है और बहुत अच्छी तरह से काम नहीं करेगा यदि आपके पास बहुत सारे तत्व हैं जिन्हें "बदलें या सम्मिलित करें" की आवश्यकता है।

एक "निकालें" और फिर एक "InsertAfter | InsertBefore" करें।

उदाहरण के लिए,

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertAfter(/configuration/system.web/authentication)">
  <deny users="?"/>
  <allow users="*"/>
</authorization>

17
यदि VS2012 का उपयोग कर रहे हैं, तो अब एक बेहतर समाधान है। नीचे देखें stackoverflow.com/a/16679201/32055
क्रिस हैन्स

1
यदि आवश्यक हो तो "InsertIfMissing" डालें और बदलें?
जेसी

मैं इस विकल्प को InsertAfter के उपयोग के लिए अन्य धन्यवाद पर पसंद करता हूं। अगर आप किसी भी तरह से हटा रहे हैं, तो InsertIfMissing का कोई मतलब नहीं है।
शेन कोर्ट्रेल

125

VS2012 में xdt:Transform="Remove"उपयोग के साथ संयोजन के रूप xdt:Transform="InsertIfMissing"में।

<authorization xdt:Transform="Remove" />
<authorization xdt:Transform="InsertIfMissing">
  <deny users="?"/>
  <allow users="*"/>
</authorization>

उत्तम! यह वही है जिसकी हम प्रतीक्षा कर रहे हैं।
क्रिस हैन्स

9
यह ओपी अनुरोधों के रूप में बिल्कुल नहीं करता है।
ब्रैडलैन

2
उत्तर को अधिक स्पष्ट रूप से प्रदर्शित किया गया है कि यह मूल प्रश्न का उत्तर कैसे देता है।
बॉन

25
मुझे नहीं मिला। यदि आप इसे हटाते हैं, तो निश्चित रूप से यह गायब होने वाला है, यह उस बिंदु पर सिर्फ एक इन्सर्ट है, है ना?
चाड शोगिन्स

6
@ChadSchouggins जरूरी नहीं: Removeकार्य केवल पहली घटना को हटाता है। कुछ तत्वों में कई घटनाएं हो सकती हैं। मैं कल्पना नहीं कर सकता कि आप ऐसा चाहते हैं, लेकिन तब यह पहली घटना को हटा देगा और InsertIfMissingकार्य को छोड़ देगा । लेकिन आप सही होते अगर वह RemoveAllइसके बजाय इस्तेमाल करता।
स्टीवन लिकेन्स

89

InsertIfMissingपरिवर्तन का उपयोग यह सुनिश्चित करने के लिए करें कि ऐपसेटिंग मौजूद है।
फिर Replaceइसके मूल्य को निर्धारित करने के लिए परिवर्तन का उपयोग करें ।

<appSettings>
  <add key="Environment" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="Environment" value="Live" xdt:Transform="Replace" xdt:Locator="Match(key)" />
</appSettings>

आप SetAttributesइसके बजाय परिवर्तन का उपयोग कर सकते हैं Replace। अंतर यह है कि SetAttributesबाल नोड्स को स्पर्श नहीं करता है।

<appSettings>  
  <add key="UseLivePaymentService" xdt:Transform="InsertIfMissing" xdt:Locator="Match(key)" />
  <add key="UseLivePaymentService" value="true" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
</appSettings>

ये तकनीक निकालें + सम्मिलित करने से बहुत बेहतर हैं क्योंकि मौजूदा नोड्स को उनके मूल नोड के निचले भाग में नहीं ले जाया जाता है। अंत में नए नोड्स संलग्न किए गए हैं। मौजूदा नोड्स वे रहते हैं जहां वे स्रोत फ़ाइल में हैं।

यह उत्तर केवल विजुअल स्टूडियो (2012 या नए) के नए संस्करणों पर लागू होता है।


7

मेरे लिए एक बेहतर तरीका यह था कि मैं तत्व को तभी सम्मिलित करूँ जब वह मौजूद न हो क्योंकि मैं केवल कुछ विशेषताओं को स्थापित कर रहा हूँ। यदि तत्व मौजूद है, तो तत्व को हटाना मुख्य तत्व के किसी अन्य गुण को छोड़ देगा।

उदाहरण: web.config (तत्व के बिना)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

web.config (तत्व के साथ)

<serviceBehaviors>
    <behavior name="Wcf.ServiceImplementation.AllDigitalService_Behavior">
        <serviceDebug httpsHelpPageEnabled="true" />
        <serviceMetadata httpGetEnabled="true" />
    </behavior>
</serviceBehaviors>

एक्सपीथ एक्सप्रेशन के साथ लोकेटर का उपयोग करते हुए, मैं नोड जोड़ता हूं यदि यह मौजूद नहीं है और फिर मेरी विशेषता सेट करें:

<serviceDebug xdt:Transform="Insert"
  xdt:Locator="XPath(/configuration/system.serviceModel/behaviors/serviceBehaviors/behavior[not(serviceDebug)])" />
<serviceDebug includeExceptionDetailInFaults="true" xdt:Transform="SetAttributes" />

दोनों परिणामी web.config फ़ाइलों मेंExceptionDetailInFaults = "true" शामिल है और दूसरा वह है जो httpsHelpPageEnabled विशेषता को सुरक्षित रखता है, जहाँ से हटाने / डालने की विधि नहीं होगी।


1
मुझे यह विचार पसंद है, लेकिन मुझे एक त्रुटि मिल रही है यदि तत्व पहले से मौजूद है "स्रोत दस्तावेज़ में कोई तत्व मेल नहीं खाता ..."। यही है, अगर यह मौजूद है, तो "नहीं" विफल हो रहा है, इसलिए यह एक त्रुटि है।
गोडेई

यह वह तकनीक है जिसकी आपको आवश्यकता है जब आप XDT के संस्करणों का उपयोग कर रहे हैं जो नए (ish) "InsertIfMissing" तत्व का समर्थन नहीं करते हैं।
इयानब्रु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.