Uso de diferentes configuraciones web en entornos de desarrollo y producción.

194

Necesito usar una cadena de conexión de base de datos diferente y una dirección de servidor SMTP en mi aplicación ASP.NET dependiendo de que se ejecute en el entorno de desarrollo o producción.

La aplicación lee la configuración del archivo Web.config a través de la propiedad WebConfigurationManager.AppSettings .

Utilizo el comando Build / Publish para implementar la aplicación en el servidor de producción a través de FTP y luego reemplazar manualmente Web.config remoto con el correcto.

¿Es posible de alguna manera simplificar el proceso de implementación? ¡Gracias!

Alexander Prokofyev
fuente

Respuestas:

159

En Visual Studio 2010 y versiones posteriores, ahora tiene la capacidad de aplicar una transformación a su web.config según la configuración de compilación.

Al crear un archivo web.config, puede expandir el archivo en el explorador de soluciones y verá dos archivos:

  • Web.Debug.Config
  • Web.Release.Config

Contienen código de transformación que se puede usar para

  • Cambiar la cadena de conexión
  • Eliminar el rastro de depuración y la configuración
  • Registrar páginas de error

Consulte Web.config Transformation Syntax for Web Application Project Deployment en MSDN para obtener más información.

También es posible, aunque oficialmente no es compatible, aplicar el mismo tipo de transformación a un app.configarchivo de aplicación no web . Consulte el blog de Phil Bolduc sobre cómo modificar el archivo de su proyecto para agregar una nueva tarea a msbuild.

Esta es una solicitud de larga duración en Visual Studio Uservoice .

Una extensión para Visual Studio 2010 y superior, " SlowCheetah " , está disponible para encargarse de crear transformaciones para cualquier archivo de configuración. A partir de Visual Studio 2017.3, SlowCheetah se ha integrado en el IDE y Microsoft administra la base de código. Esta nueva versión también admite la transformación JSON.

Pierre-Alain Vigeant
fuente
77
Tenga en cuenta que esto no funciona para proyectos de sitios web antiguos . Solo para aplicaciones web . No he tratado de ver si la solución de Phil Bolduc funciona para sitios web, pero sospecho que no, ya que no tienen archivos de proyecto.
mes
13
También tenga en cuenta que las transformaciones web.confg funcionan solo para PUBLICAR, no funcionan si simplemente construye / ejecuta F5: ((((
Alex
77
Si su web.config no contiene un Web.Debug.Configy Web.Release.Config, es posible que deba hacer clic derecho Web.Configy clic Add Config Transforms.
Doug S
1
@Alex: ¿cómo podemos usarlo para una compilación simple / F5?
apostador
1
enlace directo a SlowCheetah: marketplace.visualstudio.com/…
Xiao
83

La <appSettings>etiqueta en web.config admite un atributo de archivo que cargará una configuración externa con su propio conjunto de claves / valores. Esto anulará cualquier configuración que tenga en su web.config o la agregue.

Aprovechamos esto modificando nuestro web.config en el momento de la instalación con un atributo de archivo que coincida con el entorno en el que se está instalando el sitio. Hacemos esto con un interruptor en nuestro instalador.

p.ej;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

Nota:

  • Los cambios en el .config especificado por el atributo no desencadenarán un reinicio del proceso de trabajo asp.net
Jason Slocomb
fuente
2
Esta es una excelente respuesta, especialmente cuando tiene una gran cantidad de entornos y algunas de las configuraciones para algunos entornos tienen contraseñas y similares que no desea rastrear en el control de origen.
Phil
1
¿Hay alguna forma dinámica de cambiar la ruta del archivo? ¿De acuerdo con el servidor en el que se encuentra? Solo una nota al margen, esto está funcionando en un antiguo proyecto de sitio web, no en una aplicación web. ¡Así que gracias!
Perspectiva
2
Hay un atributo restartOnExternalChangesque tratará esos archivos como si fueran web.configs. Fuente: learnable.com/books/…
David Schwartz
13

Me gustaría saber también. Esto me ayuda a aislar el problema

<connectionStrings configSource = "connectionStrings.config" />

Luego mantengo un connectionStrings.config así como un "{host} connectionStrings.config". Sigue siendo un problema, pero si hace esto para secciones que difieren en los dos entornos, puede implementar y versionar el mismo web.config.

(Y no uso VS, por cierto)

harpo
fuente
Si usaría VS, podría usar prebuild-events para copiar desde un debug.connectionstrings.config o un release.connectionstrings.config como: copy $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config como se sugiere por Scott Hanselmann: hanselman.com/blog/…
Thomas
6

Utilizo NAnt Build Script para implementar en mis diferentes entornos. Tengo que modificar mis archivos de configuración a través de XPath dependiendo de dónde se implementen, y luego los coloca automáticamente en ese entorno usando Beyond Compare .

La configuración demora uno o dos minutos, pero solo necesita hacerlo una vez. Luego, los archivos por lotes se hacen cargo mientras voy a buscar otra taza de café. :)

Aquí hay un artículo que encontré al respecto.

Jeff Sheldon
fuente
5

En un proyecto en el que teníamos 4 entornos (desarrollo, prueba, preparación y producción), desarrollamos un sistema en el que la aplicación seleccionaba la configuración adecuada según el nombre de la máquina en la que se implementó.

Esto funcionó para nosotros porque:

  • los administradores pueden implementar aplicaciones sin involucrar a los desarrolladores (un requisito) y sin tener que jugar con los archivos de configuración (que odiaban);
  • nombres de máquinas adheridos a una convención. Emparejamos nombres usando una expresión regular y los implementamos en múltiples máquinas en un entorno; y
  • Utilizamos seguridad integrada para las cadenas de conexión. Esto significa que podríamos mantener los nombres de cuenta en nuestros archivos de configuración en tiempo de diseño sin revelar ninguna contraseña.

Funcionó bien para nosotros en este caso, pero probablemente no funcionaría en todas partes.

dariom
fuente
3

El editor de configuración de Enterprise Library puede ayudarlo a hacer esto. Le permite crear un archivo de configuración base y luego deltas para cada entorno. Luego puede fusionar la configuración base y el delta para crear un web.config específico del entorno. Eche un vistazo a la información aquí que lo lleva a través de ella mejor que yo.

PhilPursglove
fuente
3

También podría convertirlo en un paso posterior a la compilación. Configure una nueva configuración que es "Implementar" además de Depuración y lanzamiento, y luego haga que el paso posterior a la compilación copie sobre el archivo web.config correcto.

Utilizamos compilaciones automatizadas para todos nuestros proyectos, y con ellos el script de compilación actualiza el archivo web.config para que apunte a la ubicación correcta. Pero eso no lo ayudará si está haciendo todo desde VS.

Cory Foy
fuente
3

Este es uno de los grandes beneficios de usar machine.config. En mi último trabajo, tuvimos entornos de desarrollo, prueba y producción. Podríamos usar machine.config para cosas como cadenas de conexión (a la máquina de SQL dev / test / prod apropiada).

Esto puede no ser una solución para usted si no tiene acceso a la máquina de producción real (como si estuviera utilizando una empresa de alojamiento en un host compartido).

Timothy Khouri
fuente
1

También puede usar la extensión "Transformación de configuración" funciona igual que "SlowCheetah",

Parth Kale
fuente
Sí, funciona, pero solo en la implementación, no en la compilación, desearía poder simplemente compilar y depurar usando diferentes entornos de transformación de configuración
Ch'nycos