Elmah - ASP.NET -> Несколько строк подключения -> Установить строку подключения журнала ошибок SQL в коде - PullRequest
3 голосов
/ 18 мая 2009

Я собираюсь интегрировать ELMAH в существующее приложение ASP.NET для дальнейшей поддержки исследований ошибок и может использовать некоторую помощь со строками подключения. Мы используем один файл web.config для всех или наших сред, в которых развернуто приложение, и во время выполнения приложение решает, в какой среде оно находится, обычно на основе URL.

Это то, что стандартный блок хотел бы для нас ...

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

В Elmah кажется, что вам просто нужно указать имя строки подключения, но как я могу сделать это динамически во время выполнения? Например, если я тестирую, то я хочу это:

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

но если я в PROD:

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

EDIT
Практика развертывания веб-приложений выходит за рамки того, что я пытаюсь сделать. Мне нужно решение кода, которое позволяет мне изменять источник данных для журнала ошибок ELMAH Sql ...

Я не могу изменить способ развертывания веб-приложений сегодня. Это означает, что все, что находится в TEST, перемещается в CERT. То, что находится в CERT, перемещается в PROD. Веб-приложение должно быть в состоянии определить, в какой среде оно работает и как таковое ...

Ответы [ 5 ]

4 голосов
/ 18 мая 2009

Я использую проект веб-развертывания для этого. Вы можете указать файл со строкой подключения в нем для каждой Конфигурации (Отладка и Выпуск по умолчанию). Таким образом, все ваши файлы конфигурации для всех развертываний имеют одинаковые файлы, и ваш web.config обновляется соответствующим образом для каждого развертывания.

Скотт Гу имеет хорошую информацию здесь: http://weblogs.asp.net/scottgu/archive/2005/11/06/429723.aspx

Это для предыдущего выпуска, но информация по-прежнему применима.

4 голосов
/ 18 мая 2009

Поскольку Elmah с открытым исходным кодом, было бы легко добавить свой собственный: -)

Все, что вам нужно сделать, это добавить новое статическое свойство в класс SqlErrorLog, который будет содержать строку соединения, которую вы хотите использовать, и затем вы обновите свойство SqlErrorLog.ConnectionString, чтобы оно возвращало вашу пользовательскую строку соединения, если оно имел значение.

Попробуйте добавить что-то подобное в класс (предупреждение - непроверенный код):

public static string CustomConnectionString { get; set; }

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

Этого должно быть достаточно. Теперь все, что вам нужно сделать, - это найти место, где вы выбираете строку подключения, и обновить ее, чтобы также установить свойство SqlErrorLog.CustomConnectionString.

0 голосов
/ 23 ноября 2011

Можем ли мы использовать в этом случае контекст базы данных?

У меня есть веб-приложение в MVC 3, и я подключаюсь к базе данных с контекстом базы данных (согласно приведенному выше примеру):

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

Где TESTAppDB:

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

Если я хочу подключиться к другой базе данных, я пишу:

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

Кажется, это правильно ...

0 голосов
/ 25 июня 2010

Чтобы использовать ответ Руна Гримстада, в дополнение к его изменениям добавьте:

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

после

string connectionString = ConnectionStringHelper.GetConnectionString(config);

в конструкторе SqlErrorLog (IDictionary config).

Затем я сделал то, что сделал RSolberg, но в application_start вместо сеанса:

Elmah.SqlErrorLog.CustomConnectionString = "Ваш CS";

0 голосов
/ 18 мая 2009

Я бы использовал одно имя строки подключения "AppDB", но фактически размещал строку подключения во внешнем (вне файла web.config) файле конфигурации, который отличается в каждой среде.

В вашем web.config:

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

Затем в файле 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>

Затем, в зависимости от среды, в которой находится файл connectionStrings.config, измените connectionString. В коде просто обратитесь к «AppDB».

...