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

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

Вопрос

Я ищу интеграцию ЭЛЬМА в существующее приложение 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>

РЕДАКТИРОВАТЬ
Практика развертывания веб-приложений выходит за рамки того, что я пытаюсь сделать.Мне нужно решение кода, которое позволит мне изменить источник данных для журнала ошибок ELMAH Sql...

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

Это было полезно?

Решение

Поскольку 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 свойство.

Другие советы

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

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

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

Я бы использовал одно имя строки подключения «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».

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

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

после:

string connectionString = ConnectionStringHelper.GetConnectionString(config);

в конструкторе SqlErrorLog(конфигурация IDictionary).

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

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

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

У меня есть веб-приложение в 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();
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top