xdt visual studio remove net example deploy asp app asp.net web-config-transform xslt xdt-transform

asp.net - visual - ¿Hay alguna manera de hacer un "Reemplazar o Insertar" usando la transformación web.config?



web.config transform connection string example (5)

Estoy usando la transformación web.config como se describe en la siguiente publicación para generar configuraciones para diferentes entornos.

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

Puedo hacer una transformación "Reemplazar" haciendo coincidir en la clave, por ejemplo

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

Y puedo hacer "insertos", por ejemplo

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

Pero lo que realmente me parece útil es una transformación ReplaceOrInsert, ya que no siempre puedo confiar en que el archivo de configuración original tenga / no tenga una determinada clave.

¿Hay alguna manera de hacer esto?


En conjunción con xdt:Transform="Remove" use xdt:Transform="InsertIfMissing" en VS2012.

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


Encontré una solución económica. No es bonito y no funcionará muy bien si tiene muchos elementos que deben ser "Reemplazar o Insertar".

Haga un "Eliminar" y luego un "InsertAfter | InsertBefore".

Por ejemplo,

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


Lo siguiente crea una nueva clave, la misma clave no está presente. si está presente, simplemente reemplaza el existente.

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


Un método mejor para mí fue insertar el elemento solo si no existe, ya que solo estoy configurando ciertos atributos. La eliminación del elemento descartaría cualquier otro atributo del elemento principal si existieran.

ejemplo: web.config (sin elemento)

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

web.config (con elemento)

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

Usando el Localizador con una expresión XPath, agrego el nodo si no existe y luego establezco mi atributo:

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

ambos archivos web.config resultantes tienen includeExceptionDetailInFaults = "true" y el segundo conserva el atributo httpsHelpPageEnabled donde el método remove / insert no lo haría.


Use la transformación InsertIfMissing para asegurarse de que existe la aplicación de configuración.
Luego use la transformación Replace para establecer su valor.

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

También podría usar la transformación SetAttributes lugar de Replace . La diferencia es que SetAttributes no toca los nodos secundarios.

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

Estas técnicas son mucho mejores que eliminar + insertar porque los nodos existentes no se mueven a la parte inferior de su nodo padre. Se añaden nuevos nodos al final. Los nodos existentes permanecen donde están en el archivo fuente.

Esta respuesta se aplica solo a las versiones más nuevas de Visual Studio (2012 o más reciente).