Я смотрю на использование ELMAH впервые, но имею требование, которому нужно отвечать, что я не уверен, как пойти о достижении...
В основном я собираюсь настроить ELMAH, чтобы работать в соответствии с asp.net MVC и заставить его регистрировать ошибки к базе данных, когда они происходят. Вдобавок к этому я использовать customErrors для направления пользователя к дружественной странице сообщения, когда ошибка происходит. Довольно стандартный материал...
Требование - то, что на этой пользовательской ошибочной странице у меня есть форма, которая включает пользователю для предоставления дополнительной информации, если они желают. Теперь проблема возникает вследствие того, что в этой точке ошибка уже зарегистрирована, и я должен связать зарегистрированную ошибку с пользовательской обратной связью.
Обычно, если бы я использовал свою собственную реализацию, после того, как я регистрирую ошибку, я прошел бы через идентификатор ошибки к пользовательской ошибочной странице так, чтобы ассоциация могла быть сделана. Но из-за способа, которым работает ELMAH, я не думаю, что то же довольно возможно.
Следовательно я задавался вопросом, как люди думали, что можно было бы пойти о выполнении этого....
Удачи
ОБНОВЛЕНИЕ:
Мое решение проблемы следующие:
public class UserCurrentConextUsingWebContext : IUserCurrentConext
{
private const string _StoredExceptionName = "System.StoredException.";
private const string _StoredExceptionIdName = "System.StoredExceptionId.";
public virtual string UniqueAddress
{
get { return HttpContext.Current.Request.UserHostAddress; }
}
public Exception StoredException
{
get { return HttpContext.Current.Application[_StoredExceptionName + this.UniqueAddress] as Exception; }
set { HttpContext.Current.Application[_StoredExceptionName + this.UniqueAddress] = value; }
}
public string StoredExceptionId
{
get { return HttpContext.Current.Application[_StoredExceptionIdName + this.UniqueAddress] as string; }
set { HttpContext.Current.Application[_StoredExceptionIdName + this.UniqueAddress] = value; }
}
}
Затем, когда ошибка происходит, у меня есть что-то вроде этого в моем Global.asax:
public void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
var item = new UserCurrentConextUsingWebContext();
item.StoredException = args.Entry.Error.Exception;
item.StoredExceptionId = args.Entry.Id;
}
Затем, где когда-либо Вы позже, можно вытащить детали
var item = new UserCurrentConextUsingWebContext();
var error = item.StoredException;
var errorId = item.StoredExceptionId;
item.StoredException = null;
item.StoredExceptionId = null;
Обратите внимание, что это не на 100% прекрасно как его возможное для того же IP, чтобы иметь несколько запросов, чтобы иметь ошибки одновременно. Но вероятный капот того случая является удаленным. И это решение независимо от сессии, которая в нашем случае важна, также некоторые ошибки могут заставить сессии быть завершенными и т.д. Следовательно, почему этот подход работал приятно на нас.
ErrorLogModule
в ELMAH (на момент написания статьи 1.1) предоставляет Logged
событие, которое можно обработать в Global.asax
и которое можно использовать для передачи подробной информации, например, через HttpContext.Items
коллекцию, на вашу пользовательскую страницу ошибок. Если вы зарегистрировали ErrorLogModule
под именем ErrorLog
в web.config
, то ваш обработчик событий в Global.asax
будет выглядеть следующим образом:
void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
var id = args.Entry.Id
// ...
}