Elmah - ASP.NET -> Múltiplas cadeias de conexão -> Erro Set SQL Log seqüência de conexão no código
-
22-08-2019 - |
Pergunta
Eu estou olhando para integrar ELMAH em um aplicativo ASP.NET existente para um apoio adicional erro investigações e poderia usar alguma ajuda com as seqüências de conexão. Nós usamos um único arquivo web.config para todos ou nossos ambientes o aplicativo é implantado, e em tempo de execução, o aplicativo decide qual ambiente que se encontra, tipicamente baseada na URL.
Isto é o que um bloco padrão gostaria como para nós ...
<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>
Com Elmah, parece que você só precisa especificar o nome da cadeia de conexão, mas como posso fazer isso dinamicamente em tempo de execução? Por exemplo, se eu sou teste, então eu quero com isto:
<elmah>
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="TESTAppDB"/>
</elmah>
mas se eu estou em PROD:
<elmah>
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="PRODAppDB"/>
</elmah>
Editar
As práticas de implantação de aplicações web estão bem fora do escopo para o que estou tentando fazer. Eu preciso de uma solução de código que me permite mudar a fonte de dados para o erro ELMAH Sql Log ...
Eu não posso mudar a nossa forma de implantar aplicações web hoje. Isso significa que, qualquer que seja em TEST, move-se para CERT. O que está em CERT move para PROD. O aplicativo web deve ser capaz de determinar qual o ambiente que se encontra e executar, como tal, ...
Solução
Desde Elmah é open-source que seria fácil para adicionar seu próprio: -)
Tudo que você precisa fazer foi adicionar uma nova propriedade estática para a classe SqlErrorLog
que contêm a string de conexão que você queria usar e, em seguida, você atualizar a propriedade SqlErrorLog.ConnectionString
para retornar a seqüência de conexão personalizada se tivesse um valor.
Tente adicionar algo como isso para a classe (aviso - código não testado):
public static string CustomConnectionString { get; set; }
public virtual string ConnectionString
{
get
{
if (string.IsNullOrEmpty(CustomConnectionString))
{
return _connectionString;
}
else
{
return CustomConnectionString;
}
}
}
Isso deve ser suficiente. Agora tudo que você deve fazer é encontrar o local onde você seleciona a seqüência de conexão e atualizá-lo para também definir a propriedade SqlErrorLog.CustomConnectionString
.
Outras dicas
Eu uso um projeto de implantação da Web para isso. Você pode especificar um arquivo com a seqüência de conexão em que para cada configuração (Debug e lançamento por padrão). Desta forma, todos os seus arquivos de configuração para todas as implantações têm os mesmos arquivos e seu web.config é atualizado de forma adequada para cada implantação.
Scott Gu tem boas informações aqui: http: // weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx
É para uma versão anterior, mas a informação ainda se aplica.
Gostaria de usar um nome de seqüência de conexão "AppDB", mas na verdade sediar a seqüência de conexão em um link externo (fora do arquivo web.config) arquivo de configuração, que é diferente em cada ambiente.
Em seu web.config:
<connectionStrings configSource="config\connectionStrings.config"/>
Em seguida, no arquivo 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>
Então, dependendo do que o ambiente do arquivo connectionStrings.config está em, modificar o connectionString. No código, basta consultar a "AppDB".
Para construir sobre a resposta de Rune Grimstad, além de suas alterações, adicione:
if (connectionString.Length == 0)
connectionString = CustomConnectionString;
depois:
string connectionString = ConnectionStringHelper.GetConnectionString(config);
no construtor SqlErrorLog (IDictionary config).
Então eu fiz o que RSolberg fez, mas em Application_Start em oposição a sessão:
Elmah.SqlErrorLog.CustomConnectionString = "Sua CS";
Podemos usar neste contexto caso de banco de dados?
I têm uma aplicação web no MVC 3 e ligar a base de dados com o banco de dados de contexto (de acordo com o exemplo acima):
using (var ctx = new TESTAppDB())
{
var res = (from p in ctx.Customer select p).FirstOrDefault();
}
Onde TESTAppDB:
public class TESTAppDB: DbContext
{
public DbSet<Customer> Customer{ get; set; }
}
Se eu quiser se conectar a outro banco de dados, então eu escrever:
using (var ctx = new CERTAppDB())
{
var res = (from p in ctx.Order select p).FirstOrDefault();
}
Parece ser correta ...