40

क्या किसी को पता है कि पूरे मूल्य या विशेषता को बदलने के बजाय मूल्यों के विशिष्ट वर्गों को "रूपांतरित" करने का कोई तरीका है या नहीं?वेब का उपयोग कर उन्नत कार्य। कॉनफिग रूपांतरण

उदाहरण के लिए, मेरे पास कई ऐप सेटिंग्स प्रविष्टियां हैं जो विभिन्न webservices के लिए यूआरएल निर्दिष्ट करती हैं। ये प्रविष्टियां उत्पादन पर्यावरण की तुलना में देव पर्यावरण में थोड़ा अलग हैं। कुछ दूसरों की

<!-- DEV ENTRY --> 
<appSettings> 
<add key="serviceName1_WebsService_Url" value="http://wsServiceName1.dev.domain.com/v1.2.3.4/entryPoint.asmx" /> 
<add key="serviceName2_WebsService_Url" value="http://ma1-lab.lab1.domain.com/v1.2.3.4/entryPoint.asmx" /> 
</appSettings> 

<!-- PROD ENTRY --> 
<appSettings> 
<add key="serviceName1_WebsService_Url" value="http://wsServiceName1.prod.domain.com/v1.2.3.4/entryPoint.asmx" /> 
<add key="serviceName2_WebsService_Url" value="http://ws.ServiceName2.domain.com/v1.2.3.4/entryPoint.asmx" /> 
</appSettings> 

सूचना है कि मुट्ठी प्रवेश पर, फर्क सिर्फ इतना है ".prod" से ".dev" है की तुलना में कम तुच्छ हैं। दूसरी प्रविष्टि पर, उप डोमेन अलग है: "MA1-lab.lab1""ws.ServiceName2"

अब तक, मैं जानता हूँ कि मैं Web.Release.Config में कुछ इस तरह कर सकते हैं से :

<add xdt:Locator="Match(key)" xdt:Transform="SetAttributes(value)" key="serviceName1_WebsService_Url" value="http://wsServiceName1.prod.domain.com/v1.2.3.4/entryPoint.asmx" /> 
<add xdt:Locator="Match(key)" xdt:Transform="SetAttributes(value)" key="serviceName2_WebsService_Url" value="http://ws.ServiceName2.domain.com/v1.2.3.4/entryPoint.asmx" /> 

हालांकि, हर कि वेब सेवा के लिए संस्करण अद्यतन किया जाता है, मैं Web.Release.Config भी अपडेट करने के है, जो मेरी web.config अपडेट simplfying के प्रयोजन धरा होगा।

मुझे पता है कि मैं उस यूआरएल को विभिन्न वर्गों में भी विभाजित कर सकता हूं और उन्हें स्वतंत्र रूप से अपडेट कर सकता हूं, लेकिन मेरे पास यह सब एक कुंजी में है।

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

इन वेबसाइटों मैं एक संदर्भ के रूप में उपयोग कर रहा हूँ कर रहे हैं:

Vishal Joshi's blog, MSDN Help, और Channel9 video

किसी भी मदद की बहुत सराहना की जाएगी!

डी

उत्तर

66

तथ्य की बात आप यह कर सकते हैं, लेकिन यह उतना आसान के रूप में आप सोच सकते हैं नहीं है। आप अपना स्वयं का कॉन्फ़िगरेशन रूपांतरण बना सकते हैं। मैंने इस बारे में http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx पर एक बहुत ही विस्तृत ब्लॉग पोस्ट लिखा है। लेकिन यहाँ Hightlights हैं:

  • कक्षा लाइब्रेरी प्रोजेक्ट बना
  • संदर्भ Web.Publishing.Tasks.dll (तहत% प्रोग्राम फ़ाइलें (x86)% MSBuild \ Microsoft \ VisualStudio \ v10.0 \ वेब फ़ोल्डर) नई ट्रांस बनाने के लिए आयात:
  • Microsoft.Web.Publishing.Tasks.Transform वर्ग
  • लागू करें() विधि
  • उपयोग xdt एक प्रसिद्ध स्थान में
  • प्लेस विधानसभा का विस्तार लागू प्रपत्र उपलब्ध
  • उपयोग

को बदलने यहाँ वर्ग मैं ऐसा करने के लिए बनाया इस की जगह

namespace CustomTransformType 
{ 
    using System; 
    using System.Text.RegularExpressions; 
    using System.Xml; 
    using Microsoft.Web.Publishing.Tasks; 

    public class AttributeRegexReplace : Transform 
    { 
     private string pattern; 
     private string replacement; 
     private string attributeName; 

     protected string AttributeName 
     { 
      get 
      { 
       if (this.attributeName == null) 
       { 
        this.attributeName = this.GetArgumentValue("Attribute"); 
       } 
       return this.attributeName; 
      } 
     } 
     protected string Pattern 
     { 
      get 
      { 
       if (this.pattern == null) 
       { 
        this.pattern = this.GetArgumentValue("Pattern"); 
       } 

       return pattern; 
      } 
     } 

     protected string Replacement 
     { 
      get 
      { 
       if (this.replacement == null) 
       { 
        this.replacement = this.GetArgumentValue("Replacement"); 
       } 

       return replacement; 
      } 
     } 

     protected string GetArgumentValue(string name) 
     { 
      // this extracts a value from the arguments provided 
      if (string.IsNullOrWhiteSpace(name)) 
      { throw new ArgumentNullException("name"); } 

      string result = null; 
      if (this.Arguments != null && this.Arguments.Count > 0) 
      { 
       foreach (string arg in this.Arguments) 
       { 
        if (!string.IsNullOrWhiteSpace(arg)) 
        { 
         string trimmedArg = arg.Trim(); 
         if (trimmedArg.ToUpperInvariant().StartsWith(name.ToUpperInvariant())) 
         { 
          int start = arg.IndexOf('\''); 
          int last = arg.LastIndexOf('\''); 
          if (start <= 0 || last <= 0 || last <= 0) 
          { 
           throw new ArgumentException("Expected two ['] characters"); 
          } 

          string value = trimmedArg.Substring(start, last - start); 
          if (value != null) 
          { 
           // remove any leading or trailing ' 
           value = value.Trim().TrimStart('\'').TrimStart('\''); 
          } 
          result = value; 
         } 
        } 
       } 
      } 
      return result; 
     } 

     protected override void Apply() 
     { 
      foreach (XmlAttribute att in this.TargetNode.Attributes) 
      { 
       if (string.Compare(att.Name, this.AttributeName, StringComparison.InvariantCultureIgnoreCase) == 0) 
       { 
        // get current value, perform the Regex 
        att.Value = Regex.Replace(att.Value, this.Pattern, this.Replacement); 
       } 
      } 
     } 
    } 
} 

यहाँ वेब है।config

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="one" value="one"/> 
    <add key="two" value="partial-replace-here-end"/> 
    <add key="three" value="three here"/> 
    </appSettings> 
</configuration> 

यहाँ मेरी कॉन्फ़िग फ़ाइल को बदलने है

<?xml version="1.0"?> 

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 

    <xdt:Import path="C:\Program Files (x86)\MSBuild\Custom\CustomTransformType.dll" 
       namespace="CustomTransformType" /> 

    <appSettings> 
    <add key="one" value="one-replaced" 
     xdt:Transform="Replace" 
     xdt:Locator="Match(key)" /> 
    <add key="two" value="two-replaced" 
     xdt:Transform="AttributeRegexReplace(Attribute='value', Pattern='here',Replacement='REPLACED')" 
     xdt:Locator="Match(key)"/> 
    </appSettings> 
</configuration> 

यहाँ परिवर्तन के बाद परिणाम

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="one" value="one-replaced"/> 
    <add key="two" value="partial-replace-REPLACED-end"/> 
    <add key="three" value="three here"/> 
    </appSettings> 
</configuration> 
+0

कहा, यह कमाल है! इसका उत्तर देने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद, मैं आशा खोना शुरू कर रहा था :) –

+0

पवित्र क्रिप्स, यह बहुत अच्छा है! बहुत बहुत धन्यवाद, दोस्त .. यह वही है जो मुझे चाहिए :) –

+0

यह इतना भयानक है कि ऐसा करने का एक आसान तरीका नहीं है। :(हालांकि इसके लिए धन्यवाद, यह बहुत उपयोगी था। –

3
बस एक अद्यतन के रूप में

, आप विजुअल स्टूडियो 2013 का उपयोग कर रहे हैं तो हम , आपको इसके बजाय% प्रोग्राम फ़ाइलें (x86)% MSBuild \ Microsoft \ VisualStudio \ v12.0 \ Web \ Microsoft.Web.XmlTransform.dll का संदर्भ देना चाहिए।

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