Elmah - ASP.NET -> Cadenas de conexión múltiple -> Configurar SQL Error Cadena registro de conexión en el Código

StackOverflow https://stackoverflow.com/questions/878987

Pregunta

Busco integrar ELMAH en una aplicación ASP.NET existente para un mayor apoyo investigaciones de error y podría usar un poco de ayuda con las cadenas de conexión. Utilizamos un solo archivo web.config para todos nuestros ambientes o la aplicación se implementa en, y en tiempo de ejecución, la aplicación decide qué entorno se encuentra, por lo general basado en URL.

Esto es lo que un bloque estándar le gustaría como para nosotros ...

  <connectionStrings>
    <add name="TESTAppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
    <add name="CERTAppDB" connectionString="Data Source=SQL-C-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
    <add name="PRODAppDB" connectionString="Data Source=SQL-P-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
  </connectionStrings>

Con Elmah, parece que sólo tiene que especificar el nombre de la cadena de conexión, pero ¿cómo puedo hacer esto de forma dinámica en tiempo de ejecución? Por ejemplo, si yo soy la prueba, entonces yo quiero esto:

<elmah>
     <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="TESTAppDB"/>
</elmah>

pero si estoy en PROD:

<elmah>
     <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="PRODAppDB"/>
</elmah>

Editar
Las prácticas de implementación de aplicaciones web están bien fuera del alcance de lo que estoy tratando de hacer. Necesito una solución de código que me permite cambiar la fuente de datos para el registro de errores SQL ELMAH ...

No puedo cambiar la forma de desplegar aplicaciones web hoy en día. Eso quiere decir, lo que está en TEST, se traslada a Cert. Lo que está en CERT mueve a PROD. La aplicación web debe ser capaz de determinar qué entorno se encuentra y funcionar como tal ...

¿Fue útil?

Solución

Desde Elmah es de código abierto sería fácil añadir su: -)

Todo lo que tendría que hacer era añadir una nueva propiedad estática de la clase SqlErrorLog que contendría la cadena de conexión que desea utilizar y, entonces sería actualizar la propiedad SqlErrorLog.ConnectionString para devolver su cadena de conexión personalizada si tuviera un valor.

Trate de añadir algo como esto a la clase (advertencia - código no probado):

public static string CustomConnectionString { get; set; }

public virtual string ConnectionString
{
  get 
  { 
    if (string.IsNullOrEmpty(CustomConnectionString)) 
    {
      return _connectionString;
    }
    else
    {
      return CustomConnectionString; 
    }
  }
}

Esto debería ser suficiente. Ahora todo lo que tiene que hacer es encontrar la ubicación donde se selecciona la cadena de conexión y actualizarlo configurar también la propiedad SqlErrorLog.CustomConnectionString.

Otros consejos

Yo uso un proyecto de implementación para esta Web. Se puede especificar un archivo con la cadena de conexión en el mismo para cada configuración (depuración y liberación por defecto). De esta manera todos los archivos de configuración para todas las implementaciones tienen los mismos archivos y su web.config se actualiza adecuadamente para cada despliegue.

Scott Gu tiene buena información aquí: http: // weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

Es una versión anterior, pero la información sigue siendo válida.

Me gustaría utilizar un nombre de cadena de conexión "AppDB", pero en realidad la sede de la cadena de conexión en una externa (fuera del archivo web.config) archivo de configuración, que es diferente en cada entorno.

En el web.config:

<connectionStrings configSource="config\connectionStrings.config"/>

A continuación, en el archivo connectionStrings.config:

<connectionStrings>    
    <add name="AppDB" connectionString="Data Source=SQL-T-APPNAME.COMPANY.COM;Initial Catalog=APPNAME;User ID=USER;Password=THEPASS" providerName="System.Data.SqlClient"/>
</connectionStrings>

A continuación, dependiendo de lo que el medio ambiente es el archivo connectionStrings.config en, modificar el connectionString. En el código, sólo se refieren a "AppDB".

Para construir sobre la respuesta de Rune Grimstad, además de sus cambios, añadir:

if (connectionString.Length == 0)
    connectionString = CustomConnectionString;

después de:

string connectionString = ConnectionStringHelper.GetConnectionString(config);

en el constructor SqlErrorLog (config IDictionary).

A continuación, hice lo que hizo RSolberg, pero en Application_Start a diferencia de sesión:

Elmah.SqlErrorLog.CustomConnectionString = "Su CS";

Se puede usar en este caso Contexto de base de datos?

Tengo una aplicación web en MVC 3 y conecto a la base de datos con el contexto de la base de datos (según el ejemplo anterior):

using (var ctx = new TESTAppDB())
{
    var res = (from p in ctx.Customer select p).FirstOrDefault();
}

Cuando TESTAppDB:

public class TESTAppDB: DbContext
{
    public DbSet<Customer> Customer{ get; set; }
}

Si quiero conectar a otra base de datos, por lo que escribo:

using (var ctx = new CERTAppDB())
{
    var res = (from p in ctx.Order select p).FirstOrDefault();
}

Parece ser correcta ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top