2010-11-11 24 views
33

He estado usando las transformaciones de configuración en VS2010 bastante últimamente, pero estoy confundido acerca de por qué algunas transformaciones se aplican directamente a Web.config en el paquete, pero otras se almacenan en un token en SetParameters.xml y luego se aplican en publicación.¿Por qué algunas transformaciones Web.config se convierten en tokenizadas en SetParameters.xml y otras no?

Por ejemplo, echar un Web.config con la siguiente configuración de cadena de conexión y aplicación:

<connectionStrings> 
    <add name="AutoDeployDb" connectionString="Data Source=(local);Initial Catalog=AutoDeploy;User ID=AutoDeployUser;Password=Passw0rd"/> 
</connectionStrings> 
<appSettings> 
    <add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" /> 
</appSettings> 

Entonces aquí está la configuración correspondiente transformación para la configuración de generación actual:

<connectionStrings> 
    <add xdt:Transform="Replace" xdt:Locator="Match(name)" name="AutoDeployDb" connectionString="Data Source=MyDevServer;Initial Catalog=AutoDeploy;User ID=AutoDeployUser;Password=s*#@Kdsl" /> 
</connectionStrings> 
<appSettings> 
    <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="ChartImageHandler" value="storage=file;timeout=20;dir=d:\inetpub\AutoDeploy\TempImageFiles\"/> 
</appSettings> 

Estos son tanto Las transformaciones "Reemplazar" y otras que no sean una cadena de conexión que coincida con "nombre" y la otra sea una configuración de aplicación que coincida con "clave", para mi ojo son idénticas.

Ahora mire dentro del archivo SetParameters.xml en el paquete resultante y solo la cadena de conexión tiene un nodo setParameter. En el archivo Web.config de la carpeta PackagTmp, la transformación de configuración de la aplicación ya se ha aplicado mientras que la cadena de conexión tiene un valor "$ (ReplacableToken_AutoDeployDb-Web.config Connection String_0)" que se aplica solo cuando se implementa el paquete.

¿Por qué es esto? ¿Es algo específico de las cadenas de conexión (o por el contrario, de la configuración de la aplicación)? Agradezco el rationale of this approach, no tengo claro por qué se aplica a algunas configuraciones y otras no.

¿Alguien puede arrojar algo de luz sobre esto?

Respuesta

37

Esto en realidad no tiene nada que ver con las transformaciones de configuración. Acabo de publicar un blog muy detallado en http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx. Pero algo de información aquí para ti.

En la canalización de publicación en la web (WPP) manejamos las cadenas de conexión como artefactos especiales. Crearemos automáticamente parámetros para usted para todas las cadenas de conexión. Esto se debe a que, en muchos casos, cuando implementa su aplicación, quiere cambiar las cadenas de conexión. No creamos automáticamente parámetros para ningún valor de configuración de la aplicación. Ahora volvamos a su pregunta ¿por qué tokenize las cadenas de conexión? Realmente estamos haciendo esto para asegurarnos de que no te pierdas la configuración del valor y, accidentalmente, tu aplicación actualice la base de datos incorrecta. Nosotros te ayudamos creando esos parámetros para ti. También puede deshabilitar este comportamiento si lo desea. Puede establecer la propiedad MSBuild AutoParameterizationWebConfigConnectionStrings en false.

+3

Sería increíblemente útil si hubiera una manera sencilla (a través de una propiedad MSBuild) de tratar las configuraciones de la aplicación (ya sea las específicas o el conjunto completo) de esta manera también. p.ej. AutoParameterizationAppSettings = true. –

+5

Este artículo es bastante bueno para definir una forma de resolver mi problema: http://vishaljoshi.blogspot.com/2010/07/web-deploy-parameterization-in-action.html –

+1

¿Pero por qué alguien querría esto? –

1

En cuanto a la implementación, hay una diferencia significativa entre ellos. Cuando importe paquetes web a IIS:

  • Las cadenas de conexión se incluirán automáticamente en el cuadro de diálogo del asistente para una parametrización adicional.
  • La configuración de la aplicación no estará allí por defecto. Si realmente quieres hacer eso, por favor, siga los pasos en "Parametrización personalizada - Configuración de la aplicación en el archivo web.config" de Configuring Parameters for Web Package Deployment

La diferenciación crea un límite entre la responsabilidad dev y operaciones. Por un lado, coloca los parámetros del entorno de destino (base de datos, caché, clave/secreto de AWS, etc.) en cadenas de conexión de las que el operador debe ocuparse. Por otro lado, coloca opciones irrelevantes en la sección de configuración de la aplicación para que la carga de ops sobre productos específicos y la lógica de negocios pueda aliviarse.

En mi compañía, un chico de operaciones a menudo es responsable de múltiples productos. Realmente no puede exigirles que conozcan tanto conocimiento de productos como usted. Cuanto menos necesitan prestar atención, más feliz será la vida.

Cuestiones relacionadas