Elmah - ASP.NET -> Несколько строк подключения -> Установить строку подключения журнала ошибок SQL в коде
-
22-08-2019 - |
Вопрос
Я ищу интеграцию ЭЛЬМА в существующее приложение 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();
}
Кажется, это правильно...