2008-11-20 26 views
163

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 si se ejecuta en entorno de desarrollo o producción.Uso de Web.config diferente en entorno de desarrollo y producción

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

Uso el comando Compilar/Publicar para implementar la aplicación en el servidor de producción a través de FTP y luego reemplazar manualmente el Web.config remoto por uno correcto.

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

Respuesta

132

En Visual Studio 2010 y por encima, ahora tiene la capacidad de aplicar una transformación a su web.config dependiendo de la configuración de compilación.

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

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

Ellos contiene código de transformación que se puede utilizar para

  • Cambiar la cadena de conexión
  • Quitar traza de depuración y ajustes
  • páginas Registro de error

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

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

Esto es una larga resistencia request on the Visual Studio Uservoice.

Un extension for Visual Studio 2010 y superior, "SlowCheetah," está disponible para encargarse de crear la transformación para cualquier archivo de configuración. Comenzando con Visual Studio 2017.3, SlowCheetah has been integrated into the IDE y la base de código está siendo administrada por Microsoft. Esta nueva versión también admite la transformación JSON.

+6

Tenga en cuenta que esto no funciona para proyectos web ** site ** antiguos. Solo para aplicaciones web **. No he intentado ver si la solución de Phil Bolduc funciona para sitios web, pero sospecho que no, ya que no tienen archivos de proyecto. –

+9

También tenga en cuenta que web.confg transforma el trabajo para PUBLICACIÓN solamente, no funcionan si simplemente compila/ejecuta F5: (((( – Alex

+5

si su web.config no contiene un 'Web.Debug.Config' y' Web.Release.Config', es posible que deba hacer clic con el botón derecho en 'Web.Config' y hacer clic en' Add Config Transforms'. –

24

¿Ha buscado proyectos de implementación web?

http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en

hay una versión para VS2005 así, si no estás en 2008.

+0

Esta es una buena guía para usar proyectos de implementación web: http://johnnycoder.com/blog/2010/01/07/deploy-aspnet-web-applications-with-web-deployment-projects/ –

+0

La versión 2005 está aquí http://msdn.microsoft.com/en-us/library/aa479568.aspx – Fandango68

+0

Los proyectos de implementación web parecen ser VS "Publishing Profiles" ahora http://www.diaryofaninja.com/blog/2012/08/ 26/visual-studio-2012-web-deployment-projects-are-dead-ndash-long-live-publishing-profiles – jocull

13

Me gustaría saber, también. Esto ayuda a aislar el problema para mí

 
<connectionStrings configSource="connectionStrings.config"/> 

entonces guardo un connectionStrings.config, así como un "{host} connectionStrings.config". Todavía es un problema, pero si hace esto para las secciones que difieren en los dos entornos, puede implementar y versión del mismo web.config.

(Y yo no uso VS, por cierto.)

+0

Si usa VS, puede usar prebuild-events para copiar desde un debug.connectionstrings.config o un release.connectionstrings.config como: copia $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config como s sugerido por Scott. Hanselmann: http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx – Thomas

3

El editor de configuración de Enterprise Library puede ayudar a hacer esto. Le permite crear un archivo de configuración base y luego deltas para cada entorno. A continuación, 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 here que lo lleva a través de él mejor que yo.

3

También podría hacer que sea un paso posterior a la construcción. Configure una nueva configuración que sea "Implementar" además de Depurar y liberar, y luego haga que el paso posterior a la compilación copie sobre el web.config correcto.

Usamos compilaciones automáticas para todos nuestros proyectos, y con ellas el script de construcció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.

6

Utilizo una secuencia de comandos de compilación NAnt para implementar en mis diferentes entornos. Lo tengo modificar mis archivos de configuración a través de XPath dependiendo de dónde se están implementando, y luego automáticamente los pone en ese entorno usando Beyond Compare.

Demora uno o dos minutos en configurarse, pero solo necesita hacerlo una vez. Luego, los archivos por lotes se hacen cargo mientras tomo otra taza de café. :)

Here's un artículo que encontré en él.

3

Este es uno de los grandes beneficios del uso de 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 SQL apropiada, dev/test/prod).

Puede que esta no sea una solución para usted si no tiene acceso a la máquina de producción real (por ejemplo, si estaba utilizando una empresa de alojamiento en un host compartido).

4

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

Esto funcionó para nosotros porque:

  • administradores pueden desplegar aplicaciones sin la participación de los desarrolladores (un requisito) y sin tener que tocar el violín con los archivos de configuración (que odiaban);
  • nombres de máquina adheridos a una convención. Emparejamos nombres usando una expresión regular y desplegamos en varias máquinas en un entorno; y
  • usamos seguridad integrada para las cadenas de conexión. Esto significa que podríamos mantener los nombres de las cuentas en nuestros archivos de configuración en el momento del diseño sin revelar ninguna contraseña.

Nos funcionó bien en este caso, pero probablemente no funcionaría en todas partes.

71

La etiqueta <appSettings> 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 agregará a ellos.

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

por ejemplo;

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

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

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

Nota:

  • Los cambios en el .config especificados por el atributo no dará lugar a un reinicio del proceso de trabajo de asp.net
+2

Esta es una excelente respuesta, especialmente cuando tienes una gran cantidad de entornos y algunas configuraciones para algunos entornos tienen contraseñas y similares que no puedes usar. Quiero seguimiento en control de fuente. – Phil

+1

¿Existe alguna forma dinámica de cambiar la ruta del archivo? ¿En función de qué servidor estás? Solo una nota al margen, esto está trabajando en un viejo proyecto de sitio web, no en una aplicación web. ¡Así que gracias! – Perspective

+2

Existe un atributo 'restartOnExternalChanges' que tratará esos archivos como si fueran web.configs. Fuente: https://learnable.com/books/the-asp-net-2-0-anthology-101-essential-tips-tricks-hacks/preview/how-can-i-simplify-my-web-config- file-a64852b –

Cuestiones relacionadas