¿Alguien sabe si hay una manera para «transformar» a secciones específicas de valores en lugar de reemplazar todo el valor o el valor de un atributo?

Por ejemplo, tengo varios appSettings entradas que especificar la Url de distintas webservices. Estas entradas son un poco diferentes en el entorno dev que el entorno de producción. Algunos son menos trivial que otros

<!-- 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>

Observe que en la primera entrada, la única diferencia es «.dev» de «.prod». En la segunda entrada, el subdominio es diferente: «ma1-lab.lab1» de «ws.ServiceName2»

Hasta ahora, sé que puedo hacer algo como esto en la Web.De liberación.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" />

Sin embargo, cada vez que la Versión para que webservice se actualiza, tengo que actualizar la Web.De liberación.Config así, que derrota el propósito de simplfying mi web.config actualizaciones.

Sé que yo también podría dividir esa URL en diferentes secciones y actualización de ellos de forma independiente, pero prefiero tener todo en una sola tecla.

He mirado a través de la web disponibles.config Transforma pero naderías parece estar orientado dirección de lo que estoy tratando de lograr.

Estos son los sitios web estoy usando como referencia:

El blog de Vishal Joshi, Ayuda de MSDN, y Channel9 video

Cualquier ayuda sería muy apreciada!

-D

InformationsquelleAutor Diego C. | 2010-05-26

2 Comentarios

  1. 67

    Como una cuestión de hecho, usted puede hacer esto, pero no es tan fácil como usted podría pensar. Usted puede crear su propio config transformación. He escrito una muy detallada de blog en http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx con respecto a este. Pero aquí están los hightlights:

    • Crear proyecto de Biblioteca de clases
    • Referencia Web.Publishing.Tasks.dll (en %Archivos de Programa (x86)%de MSBuild\Microsoft\VisualStudio\v10.0\carpeta Web)
    • Ampliar La Funcionalidad De Microsoft.Web.De publicación.Tareas.Transformar la clase
    • Implementar el Apply() método
    • Lugar la asamblea en una ubicación conocida
    • Uso xdt:Importar a hacer la nueva transformación disponibles
    • Uso transformar

    Aquí es la clase que he creado para ello sustituir

    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);
    }
    }
    }
    }
    }

    Aquí está la web.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>

    Aquí es mi config archivo de transformación

    <?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>

    Aquí está el resultado después de la transformación

    <?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>
    • Sayed, esto es impresionante! muchas gracias por tomarse el tiempo para responder a esto, yo estaba empezando a perder la esperanza 🙂
    • Santo pelos de punta, esto es IMPRESIONANTE! Muchas gracias, compañero.. esto es exactamente lo que necesito 🙂
    • Es tan horrible que no hay una manera más sencilla de hacer esto. 🙁 Gracias por esto, sin embargo, fue muy útil.
    • De hecho, esta es totalmente impresionante, buen trabajo Sayed
    • Esto me ayudó mucho. Una cosa, sin embargo, es que su clase no aplicar la transformación a todos los nodos coincidentes. He modificado el método Aplicar para hacer esto: protected override void Apply() { foreach (XmlNode target in this.TargetNodes) { foreach (XmlAttribute att in target.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); } } } }
  2. 3

    Sólo como una actualización, si usted está utilizando Visual Studio 2013, usted debe de referencia %Archivos de Programa (x86)%MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.XmlTransform.dll en su lugar.

Dejar respuesta

Please enter your comment!
Please enter your name here