2009-05-18 3 views
3

Ich bin auf der Suche nach ELMAH in eine bestehende ASP.NET-Anwendung zu weiteren Fehleruntersuchungen zu unterstützen und könnte einige Hilfe mit den Verbindungszeichenfolgen verwenden . Wir verwenden eine einzige web.config-Datei für alle oder unsere Umgebungen, in denen die Anwendung bereitgestellt wird, und zur Laufzeit entscheidet die App, in welcher Umgebung sie sich befindet, normalerweise basierend auf URL.Elmah - ASP.NET -> Mehrere Verbindungszeichenfolgen -> SQL-Fehlerprotokoll Verbindungszeichenfolge in Code

Dies ist, was ein Standard-Block wie für uns möchte ...

<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> 

Mit Elmah, es scheint, dass Sie nur den Namen der Verbindungszeichenfolge angeben müssen, aber wie kann ich das dynamisch tun zur Laufzeit? Zum Beispiel, wenn ich Test bin, dann will ich dies:

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

aber wenn ich in ART bin:

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

EDIT
Die Bereitstellungsverfahren für Web-Anwendungen sind gut aus der Spielraum für das, was ich versuche zu tun. Ich brauche eine Codelösung, die es mir erlaubt, die Datenquelle für das ELMAH Sql Error Log zu ändern ...

Ich kann die Art, wie wir heute Web-Apps bereitstellen, nicht ändern. Das heißt, was auch immer in TEST ist, bewegt sich zu CERT. Was in CERT ist, wird zu PROD verschoben. Die Webanwendung muss in der Lage sein zu bestimmen, in welcher Umgebung sie sich befindet und als solche ausgeführt wird ...

Antwort

4

Da Elmah Open-Source ist, würde es einfach sein, Ihre eigenen :-) hinzufügen

Alles, was Sie brauchen würde, war zu tun, um eine neue statische Eigenschaft auf die SqlErrorLog Klasse hinzuzufügen, die die Verbindungszeichenfolge enthalten würden Sie wollten zu verwenden und dann würden Sie die -Eigenschaft aktualisieren, um Ihre benutzerdefinierte Verbindungszeichenfolge zurückzugeben, wenn sie einen Wert hatte.

Versuchen Sie, die Klasse (Warnung - nicht getesteten Code), so etwas fügen:

public static string CustomConnectionString { get; set; } 

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

Dies sollte genug sein. Jetzt müssen Sie nur noch den Ort finden, an dem Sie Ihre Verbindungszeichenfolge auswählen, und sie aktualisieren, um auch die Eigenschaft SqlErrorLog.CustomConnectionString festzulegen.

+0

Guten Ruf auf die Fähigkeit, den Code zu greifen. Ich setze den CustomConnectionString vom Global.asax Session_Start und es arbeitet wie ein Charme! – RSolberg

+0

Nochmals vielen Dank für Ihre Hilfe zu diesem Thema. – RSolberg

+0

Könnte Wartung Kopfschmerzen sein, um tatsächlich ELMAH zu modifizieren. Können Sie einfach eine neue Klasse von SqlErrorLog erben und die Änderungen vornehmen? –

0

Ich würde einen Verbindungszeichenfolgennamen "AppDB" verwenden, aber tatsächlich die Verbindungszeichenfolge in einem externen Host (außerhalb von web.config Datei) Konfigurationsdatei, die in jeder Umgebung unterschiedlich ist.

In Ihrer web.config:

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

Dann wird in der connectionStrings.config Datei:

<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> 

Dann, je nachdem, in welcher Umgebung die connectionStrings.config Datei in ist, ändern Sie die Connection . Im Code verweisen Sie einfach auf "AppDB".

+0

Es gilt die gleiche Regel. Wir müssen die gleichen Dateien zwischen allen Umgebungen bereitstellen. Es ist nicht ideal, das weiß ich, aber nicht etwas, über das ich die Kontrolle habe. – RSolberg

4

Ich verwende dafür ein Web-Deployment-Projekt. Sie können für jede Konfiguration eine Datei mit der Verbindungszeichenfolge angeben (standardmäßig Debuggen und Freigeben). Auf diese Weise haben alle Ihre Konfigurationsdateien für alle Bereitstellungen die gleichen Dateien und Ihre Datei web.config wird für jede Bereitstellung entsprechend aktualisiert.

Scott Gu hat gute Infos hier: http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

Es ist für eine ältere Version, aber die Informationen gelten nach wie vor.

+1

abgeordnet. Ich habe Scotts Rat in einem meiner letzten Projekte befolgt und es funktioniert ganz gut! –

+0

Ich füge mehr Informationen in die Frage ein, ich wusste, dass es sich um ein Bereitstellungsproblem handeln würde, aber das ist nicht das Problem oder zumindest das Problem, das ich lösen muss. – RSolberg

0

Um auf Rune Grimstad Antwort, zusätzlich zu seinen Änderungen zu bauen, fügen:

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

nach:

string connectionString = ConnectionStringHelper.GetConnectionString(config); 

im SqlErrorLog (IDictionary config) Konstruktor.

Dann tat ich, was RSolberg tat, aber in Application_Start zu Sitzung Gegensatz:

Elmah.SqlErrorLog.CustomConnectionString = "Ihre CS";

0

Können wir in diesem Fall Datenbankkontext verwenden?

Ich habe ein Webapp in MVC 3 und ich eine Verbindung mit Datenbank-Kontext-Datenbank (nach obigem Beispiel):

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

Wo TESTAppDB:

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

Wenn ich zu einem anderen verbinden möge Datenbank, so schreibe ich:

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

Es scheint richtig zu sein ...

Verwandte Themen