Elmah - ASP.NET -> Múltiplas cadeias de conexão -> Erro Set SQL Log seqüência de conexão no código

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

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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top