ELMAH - Использование пользовательских страниц ошибок для сбора отзывов пользователей - PullRequest
8 голосов
/ 27 января 2010

Я смотрю на использование 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-адрес может иметь несколько запросов на ошибки одновременно. Но вероятная причина того, что это происходит, невелика. И это решение не зависит от сеанса, что в нашем случае важно, также некоторые ошибки могут привести к прекращению сеансов и т. Д. Поэтому этот подход хорошо сработал для нас.

1 Ответ

8 голосов
/ 06 февраля 2010

ErrorLogModule в ELMAH (версия 1.1 на момент написания этой статьи) предоставляет событие Logged, которое можно обработать в Global.asax и которое можно использовать для связи подробности, скажем, через HttpContext.Items collection, на вашу пользовательскую страницу ошибки. Если вы зарегистрировали ErrorLogModule под именем ErrorLog в web.config, тогда ваш обработчик событий в Global.asax будет выглядеть следующим образом:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)  
{ 
    var id = args.Entry.Id
    // ...  
}
...