2010-03-04 14 views
10

¿Cuál es un buen enfoque para administrar una cadena de conexión de depuración y liberación en una aplicación .NET/SQLServer?Administrar una cadena de conexión de depuración y liberación

Tengo dos servidores SQL, una producción y una compilación/depuración y necesito un método para cambiar entre los dos cuando se implementa mi aplicación ASP.NET.

Actualmente, simplemente los almaceno en el archivo web.config y comento uno o el otro, sin embargo, eso es propenso a errores cuando se despliega.

Respuesta

13

Cree una versión de depuración y publicación del archivo Web.config, p. Ej. Web.debug.config y Web.release.config. A continuación, agregue una condición de precompilación que copie la versión relevante en web.config en función del objetivo actual.

Editar: Para añadir la condición de compilación pre clic derecho en proyectar y seleccionar "Propiedades" y luego valla a la pestaña "Eventos de generación" y añadir el siguiente código para el estado de precompilación. Obviamente, tendrá que enmendar el código según sus necesidades, vea la imagen a continuación.

@echo off 

echo Configuring web.config pre-build event ... 

if exist "$(ProjectDir)web.config" del /F/Q "$(ProjectDir)web.config" 

if "$(ConfigurationName)" == "Debug Test" goto test 
if "$(ConfigurationName)" == "Debug M" goto M 
if "$(ConfigurationName)" == "Debug BA" goto BA 
if "$(ConfigurationName)" == "Release Test" goto test 
if "$(ConfigurationName)" == "Release M" goto M 
if "$(ConfigurationName)" == "Release BA" goto BA 

echo No web.config found for configuration $(ConfigurationName). Abort batch. 
exit -1 
goto :end 

:test 
copy /Y "$(ProjectDir)web.config.test" "$(ProjectDir)web.config" 
GOTO end 

:BA 
copy /Y "$(ProjectDir)web.config.BA" "$(ProjectDir)web.config" 
GOTO end 

:M 
copy /Y "$(ProjectDir)web.config.M" "$(ProjectDir)web.config" 
GOTO end 

:end 
echo Pre-build event finished 

Project Properties http://img442.imageshack.us/img442/1843/propsa.jpg

+0

Creo que esta es una buena sugerencia. ¿Puede explicar cómo agregar una condición de precompilación a un proyecto VS-2008? No estoy usando MSBuild ni ningún otro proceso de compilación. Simplemente limpio/reconstruyo y despliego desde Visual Studio. –

+0

@roygbiv: ver edición. – AxelEckenberger

+0

Gracias amigo. Su método y código de muestra hicieron un breve trabajo de esta tarea. –

2

Normalmente establezco una variable de entorno en mis servidores de producción que indica que el servidor es un servidor de producción. Luego leo la cadena de conexión correcta de mi web.config en función de si esta variable de entorno existe y se establece en el valor de producción.

+0

+1 Me gusta la idea de cambiar algo en el servidor. Esto parece menos propenso a errores que los otros enfoques. –

+0

Gracias por esta sugerencia. Es quizás el más práctico y conveniente. –

+0

Nunca pensé en esto. –

0

Bueno, quizás esto esté un poco desactualizado, pero el ODBC DSN resuelve este problema bastante bien - todavía lo uso - con rigor - DNS para diferenciar entre entornos de producción y depuración.

p.s., estoy esperando un montón de votos negativos, quizás esto será un indicador de lo que la gente piensa de un nivel de indirección para los identificadores de bases de datos.

+0

Aunque no creo que tu respuesta merezca un voto negativo, realmente no quiero ir por la ruta de DSN. –

8

La buena noticia es que .NET4 tiene a provision para eso, puede tener configuraciones separadas para cada configuración (web.Release.config, web.Debug.config).

La mala noticia es ... es probable que todavía no la uses.

+0

Tiene razón, no estoy usando .NET 4 :( –

+0

Pronto ... muy pronto ... :) – jjxtra

4

directivas del preprocesador Uso: cuando el proyecto está configurado para ejecutarse en el modo de depuración, se elegirá la cadena de conexión de depuración, de lo contrario la cadena de conexión de liberación será elegido automáticamente.

En Visual Studio, observará que las declaraciones se atenúan exclusivamente de acuerdo con la configuración del proyecto (depuración o publicación).

Sólo tiene que añadir algo como lo siguiente en el código:

string myConnectionString; 
#if DEBUG 
    myConnectionString = "your debug connection string";//may be read from your debug connection string from the config file 
#else 
    myConnectionString = "your release connection string"; //may be read from your relase connection string from the config file 
#endif 

para más detalles, compruebe this.

1

Uso una combinación del método de Sameh y Obalix en .net 3.5.

public static class DataConnection 
{ 
#if LOCALDEV 
    public const string Env = "Debug"; 
#endif 
#if STAGING 
    public const string Env="Staging"; 
#endif 
#if RELEASE 
    public const string Env="Release"; 
#endif 
    private static ConnectionStringSettingsCollection _connections; 
    static DataConnection() 
    { 
     _connections = ConfigurationManager.ConnectionStrings; 

    } 

    public static string BoloConnectionString 
    { 
     get 
     { 
      return _connections["DB1."+Env].ConnectionString; 
     } 
    } 
    public static string AOAConnectionString 
    { 
     get 
     { 
      return _connections["DB2."+Env].ConnectionString; 
     } 
    } 
    public static string DocVueConnectionString 
    { 
     get 
     { 
      return _connections["DB3."+Env].ConnectionString; 
     } 
    } 
} 

Luego, en las propiedades de mi proyecto, defino los símbolos de compilación condicional correctos. De esta forma, no tengo que mantener las cadenas de conexión codificadas como las de Sameh, pero el código solo busca la cadena en función de cómo se creó. Esto me permite tener (si es que necesito) un archivo de configuración para todas las construcciones, pero en realidad no despliego los archivos de configuración en mi proceso de compilación.Aunque la aplicación condicional.Relase.config stuff para .net 4 parece ser la forma correcta de hacerlo en el futuro.

0

Puedo decir otra solución para este problema. En el archivo de archivos csproj crear folow:

<Content Include="DB.config"> 
    <SubType>Designer</SubType> 
</Content> 
    <Content Include="DB.Debug.config"> 
    <DependentUpon>DB.config</DependentUpon> 
    <SubType>Designer</SubType> 
</Content> 
    <Content Include="DB.Release.config"> 
    <DependentUpon>DB.config</DependentUpon> 
    <SubType>Designer</SubType> 
</Content> 

en XML escrita establecer la versión de dos para la liberación y depuración.

Cuestiones relacionadas