2009-05-18 3 views
3

Je cherche à intégrer ELMAH dans une application ASP.NET existante pour prendre en charge plus de recherches d'erreurs et pourrait utiliser de l'aide avec les chaînes de connexion . Nous utilisons un seul fichier web.config pour tous les environnements dans lesquels l'application est déployée, et au moment de l'exécution, l'application décide de l'environnement dans lequel elle se trouve, généralement en fonction de l'URL.Elmah - ASP.NET -> Chaînes de connexion multiples -> Définir la chaîne de connexion du journal d'erreurs SQL dans le code

C'est ce qu'un bloc standard voudrait comme pour nous ...

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

Avec Elmah, il semble que vous avez juste besoin de spécifier le nom de la chaîne de connexion, mais comment puis-je faire dynamiquement lors de l'exécution? Par exemple, si je suis test, je veux ceci:

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

mais si je suis PROD:

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

EDIT
Les pratiques de déploiement pour les applications web sont bien sur de la portée de ce que j'essaie de faire. J'ai besoin d'une solution de code qui me permette de changer la source de données pour le journal d'erreur d'ELMAH Sql ...

Je ne peux pas changer la manière dont nous déployons des applications Web aujourd'hui. Cela signifie que tout ce qui est dans TEST passe au CERT. Ce qui est en CERT passe à PROD. L'application web doit être capable de déterminer dans quel environnement elle se trouve et fonctionner comme telle ...

Répondre

4

Depuis Elmah est open-source, il serait facile d'ajouter votre propre :-)

Tout ce que vous devez faire est d'ajouter une nouvelle propriété statique à la classe SqlErrorLog qui contiendrait la chaîne de connexion que vous vouliez à utiliser, puis vous mettriez à jour la propriété SqlErrorLog.ConnectionString pour renvoyer votre chaîne de connexion personnalisée si elle avait une valeur.

Essayez d'ajouter quelque chose comme ceci à la classe (avertissement - code non testé):

public static string CustomConnectionString { get; set; } 

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

Cela devrait être suffisant. Maintenant tout ce que vous devez faire est de trouver l'emplacement où vous sélectionnez votre chaîne de connexion et le mettre à jour pour également définir la propriété SqlErrorLog.CustomConnectionString.

+0

Bon Appel sur la possibilité d'attraper le code. Je suis en train de définir CustomConnectionString depuis Global.asax Session_Start et il fonctionne comme un charme! – RSolberg

+0

Merci encore pour votre aide à ce sujet ... Bon travail! – RSolberg

+0

Peut-être des maux de tête de maintenance pour modifier réellement ELMAH. Pouvez-vous juste hériter d'une nouvelle classe de SqlErrorLog et apporter les modifications? –

0

J'utiliserais un nom de chaîne de connexion "AppDB", mais j'hébergerais en fait la chaîne de connexion dans un external (en dehors de web.config fichier de configuration), ce qui est différent dans chaque environnement.

Dans votre web.config:

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

Ensuite, dans le fichier 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> 

Ensuite, en fonction de l'environnement du fichier connectionStrings.config est, modifiez le connectionString . Dans le code, référez-vous simplement à "AppDB".

+0

La même règle s'applique. Nous devons déployer les mêmes fichiers entre tous les environnements. Ce n'est pas idéal, je le sais, mais pas quelque chose que j'ai le contrôle. – RSolberg

4

J'utilise un projet de déploiement Web pour cela. Vous pouvez spécifier un fichier avec la chaîne de connexion pour chaque configuration (Debug et Release par défaut). De cette façon, tous vos fichiers de configuration pour tous les déploiements ont les mêmes fichiers et votre fichier web.config est mis à jour de manière appropriée pour chaque déploiement.

Scott Gu a une bonne information ici: http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

Il est pour une version précédente, mais les informations est toujours valable.

+1

Appuyé. J'ai suivi le conseil de Scott dans un de mes projets récents, et ça marche plutôt bien! –

+0

Je vais ajouter plus d'informations dans la question, je savais que cela se transformerait en un problème de déploiement, mais ce n'est pas ce que le problème est, ou au moins le problème dont j'ai besoin résolu. – RSolberg

0

Pour construire sur la réponse de Rune Grimstad, en plus de ses modifications, ajouter:

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

après:

string connectionString = ConnectionStringHelper.GetConnectionString(config); 

dans le constructeur SqlErrorLog (config IDictionary).

Alors je fait ce que RSolberg a fait, mais Application_Start par opposition à la session:

Elmah.SqlErrorLog.CustomConnectionString = "Votre CS"; Pouvons-nous utiliser dans ce cas le contexte de base de données?

0

J'ai un webapp dans MVC 3 et je me connecte à la base de données avec le contexte de base de données (selon l'exemple ci-dessus):

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

Où TESTAppDB:

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

Si je veux me connecter à un autre base de données, donc j'écris:

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

Il semble être correct ...

Questions connexes