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




web-config-transform xslt (4)

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

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" />

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

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


ऐपसेटिंग मौजूद है यह सुनिश्चित करने के लिए 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>

आप Replace बजाय SetAttributes परिवर्तन का भी उपयोग कर सकते हैं। अंतर यह है कि 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 या नए) के नए संस्करणों पर लागू होता है।


नीचे एक नई कुंजी बनाता है वही कुंजी मौजूद नहीं है। यदि मौजूद है तो यह बस मौजूदा को बदल देता है।

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


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

उदाहरण: 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>

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

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

परिणामी वेब.कॉन्फिग फाइलों में दोनों शामिल हैं एक्सेप्शनडिंटइनफॉल्ट = "सत्य" और दूसरा httpsHelpPageEnabled विशेषता को संरक्षित करता है जहां निकालने / डालने की विधि नहीं होगी।


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

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






xdt-transform