Elmah - ASP.NET -> più stringhe di connessione -> Imposta SQL Error stringa log di connessione in codice

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

Domanda

Sto cercando di integrare ELMAH in un'applicazione ASP.NET esistente per un ulteriore sostegno indagini di errore e potrebbe usare un certo aiuto con le stringhe di connessione. Usiamo un singolo file web.config per tutti i nostri ambienti o l'applicazione viene distribuita in, e in fase di esecuzione, l'applicazione decide quale ambiente si trova, in genere sulla base di URL.

Questo è ciò che un blocco standard vorrebbe come per noi ...

  <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, sembra che hai solo bisogno di specificare il nome della stringa di connessione, ma come posso fare questo in modo dinamico in fase di esecuzione? Ad esempio, se sono prova, allora voglio questo:

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

, ma se sono in PROD:

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

Modifica
Le pratiche di distribuzione per le applicazioni web sono ben fuori portata per quello che sto cercando di fare. Ho bisogno di una soluzione di codice che mi permette di cambiare l'origine dati per l'ELMAH Sql Registro errori ...

Non riesco a cambiare il nostro modo di distribuire applicazioni web oggi. Ciò significa, tutto ciò che è in TEST, si trasferisce a cert. Ciò che è in CERT si trasferisce a PROD. L'applicazione web deve essere in grado di determinare quale ambiente è in esecuzione e come tale ...

È stato utile?

Soluzione

Dal Elmah è open-source sarebbe facile aggiungere la tua: -)

Tutto quello che avrebbe bisogno di fare è stato quello di aggiungere una nuova proprietà statica alla classe SqlErrorLog che dovrebbe contenere la stringa di connessione che si desidera utilizzare e quindi si dovrebbe aggiornare la proprietà SqlErrorLog.ConnectionString per restituire la stringa di connessione personalizzata se avesse un valore.

Provare ad aggiungere qualcosa di simile alla classe (avviso - codice non testato):

public static string CustomConnectionString { get; set; }

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

Questo dovrebbe essere sufficiente. Ora tutto quello che devi fare è trovare la posizione in cui si seleziona la stringa di connessione e aggiornarlo per impostare anche la proprietà SqlErrorLog.CustomConnectionString.

Altri suggerimenti

Io uso un progetto di distribuzione Web per questo. È possibile specificare un file con la stringa di connessione in esso per ogni configurazione (Debug e Release per impostazione predefinita). In questo modo tutti i file di configurazione per tutte le distribuzioni hanno gli stessi file e il tuo web.config viene aggiornato in modo appropriato per ogni distribuzione.

Scott Gu ha buone informazioni qui: http: // weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

Si tratta di una versione precedente ma le informazioni si applica ancora.

Vorrei usare una connessione nome stringa "AppDB", ma in realtà ospitare la stringa di connessione a un monitor esterno (al di fuori del file web.config) file di configurazione, che è diverso in ogni ambiente.

Nel vostro web.config:

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

Poi, nel file 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>

Poi, a seconda di ciò dell'ambiente file connectionStrings.config è in, modificare la connectionString. Nel codice, basta fare riferimento a "AppDB".

Per costruire sulla risposta di Rune Grimstad, in aggiunta ai suoi cambiamenti, aggiungere:

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

dopo:

string connectionString = ConnectionStringHelper.GetConnectionString(config);

nel costruttore SqlErrorLog (IDictionary config).

Poi ho fatto quello che ha fatto RSolberg, ma in Application_Start al contrario di sessione:

Elmah.SqlErrorLog.CustomConnectionString = "Il tuo CS";

Possiamo utilizzare in questo contesto caso Database?

Ho una webapp in MVC 3 e mi collego al database con contesto di database (secondo l'esempio di cui sopra):

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

Dove TESTAppDB:

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

Se voglio per connettersi a un altro database, quindi scrivo:

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

Sembra essere corretto ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top