Я смотрю на использование ELMAH впервые, но у меня есть требование, которое необходимо выполнить, и я не знаю, как добиться этого ...
По сути, я собираюсь настроить ELMAH для работы под asp.net MVC и заставить его регистрировать ошибки в базе данных при их возникновении. Кроме того, я использую customErrors, чтобы направлять пользователя на страницу с дружественными сообщениями при возникновении ошибки. Довольно стандартные вещи ...
Требование заключается в том, что на этой странице пользовательской ошибки у меня есть форма, которая позволяет пользователю предоставить дополнительную информацию, если он пожелает. Теперь проблема возникает из-за того, что на данный момент ошибка уже зарегистрирована, и мне нужно связать зарегистрированную ошибку с отзывами пользователей.
Обычно, если бы я использовал свою собственную пользовательскую реализацию, после регистрации ошибки я передавал бы идентификатор ошибки на страницу пользовательской ошибки, чтобы можно было установить связь. Но из-за того, как работает ELMAH, я не думаю, что то же самое вполне возможно.
Поэтому мне было интересно, как люди думали, что можно так поступить ...
Приветствия
UPDATE:
Мое решение проблемы заключается в следующем:
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-адрес может иметь несколько запросов на ошибки одновременно. Но вероятная причина того, что это происходит, невелика. И это решение не зависит от сеанса, что в нашем случае важно, также некоторые ошибки могут привести к прекращению сеансов и т. Д. Поэтому этот подход хорошо сработал для нас.