Elmah - ASP.NET -> Plusieurs chaînes de connexion -> Définir la connexion du journal erreur SQL chaîne dans le code

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

Question

Je cherche à intégrer ELMAH dans une application ASP.NET existante pour appuyer davantage enquêtes d'erreur et pourrait utiliser un peu d'aide avec les chaînes de connexion. Nous utilisons un seul fichier web.config pour tous ou notre environnement l'application est déployée dans et à l'exécution, l'application quel environnement il décident est, généralement basé sur l'URL.

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 hors de portée de ce que je suis en train de faire. Je besoin d'une solution de code qui me permet de changer la source de données pour le ELMAH Sql Error Log ...

Je ne peux pas changer la façon dont nous déployons des applications web aujourd'hui. Cela veut dire, tout ce qui est en TEST se déplace à Cert. Ce qui est en passe de CERT PROD. L'application Web doit être en mesure de déterminer quel environnement il est et fonctionner en tant que telle ...

Était-ce utile?

La solution

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 et vous mettre à jour la propriété SqlErrorLog.ConnectionString pour retourner 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'endroit où vous sélectionnez votre chaîne de connexion et mettre à jour également définir la propriété SqlErrorLog.CustomConnectionString.

Autres conseils

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 (débogage 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 web.config est mis à jour de façon 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.

J'utiliser un nom de chaîne de connexion « AppDB », mais l'hôte en fait la chaîne de connexion dans un fichier de configuration externe (en dehors du fichier web.config), 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, modifier le connectionString. Dans le code, juste se référer à « AppDB ».

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

Peut-on utiliser dans ce cas Contexte de base de données?

I ai un webapp dans MVC 3 et me connecter à la base de données avec le contexte de bases 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 à une 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 correct ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top