2010-01-26 2 views
8

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

+0

ли вы получить эту работу? У меня та же проблема. Я последовал за советом Атифа, но когда я ссылаюсь на HttpContext.Items для Elmah Id на моей странице пользовательских ошибок, я получаю исключение с нулевой ссылкой. –

+0

@ Ronnie Overby: См. Выше edit. –

+0

Спасибо. Я думал о том, чтобы делать что-то подобное, но используя комбинацию cookie/ipaddress в качестве идентификатора. В конечном счете я просто сделал это: http://stackoverflow.com/questions/2885487/problem-passing-elmah-log-id-to-custom-error-page-in-asp-net/2906440#2906440 –

ответ

8

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 
    // ... 
} 
+0

Привет, спасибо. –

Смежные вопросы