visual transforms studio net example disabled development deploy asp asp.net visual-studio-2010 web-config transformation web-deployment

asp.net - transforms - Tareas avanzadas que utilizan la transformación Web.Config



web deploy iis visual studio (2)

De hecho, puede hacer esto, pero no es tan fácil como podría pensar. Puede crear su propia transformación de configuración. Acabo de escribir una publicación de blog muy detallada en http://sedodream.com/2010/09/09/ExtendingXMLWebconfigConfigTransformation.aspx respecto a esto. Pero aquí están los hightlights:

  • Crear proyecto de biblioteca de clases
  • Referencia Web.Publishing.Tasks.dll (en la carpeta % Archivos de programa (x86)% MSBuild / Microsoft / VisualStudio / v10.0 / Web)
  • Extender la clase Microsoft.Web.Publishing.Tasks.Transform
  • Implementar el método Apply ()
  • Coloque el conjunto en un lugar bien conocido
  • Use xdt: Import para hacer que la nueva transformación esté disponible
  • Usar transformada

Aquí está la clase que creé para hacer esto.

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á 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í está mi archivo de transformación de configuració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>

¿Alguien sabe si hay una forma de "transformar" secciones específicas de valores en lugar de reemplazar el valor completo o un atributo?

Por ejemplo, tengo varias entradas de AppSettings que especifican las URL para diferentes servicios web. Estas entradas son ligeramente diferentes en el entorno de desarrollo que en el entorno de producción. Algunos son menos triviales 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>

Tenga en cuenta 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.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" />

Sin embargo, cada vez que se actualice la versión para ese servicio web, tendría que actualizar Web.Release.Config también, lo que frustra el propósito de simplificar mis actualizaciones de web.config.

Sé que también podría dividir esa URL en diferentes secciones y actualizarlas de manera independiente, pero prefiero tenerlo todo en una clave.

Miré a través de la web.config disponible. Transformaciones pero nada parece estar orientado hacia lo que estoy tratando de lograr.

Estos son los sitios web que estoy usando como referencia:

El blog de Vishal Joshi , MSDN Help y Channel9 video

¡Cualquier ayuda sería muy apreciada!

-RE


Solo como una actualización, si usa Visual Studio 2013, debe hacer referencia a% Archivos de programa (x86)% MSBuild / Microsoft / VisualStudio / v12.0 / Web / Microsoft.Web.XmlTransform.dll.