ELMAH - 使用自定义错误页面收集用户反馈

时间:2010-01-26 22:25:24

标签: asp.net-mvc error-handling elmah custom-error-pages

我正在寻找第一次使用ELMAH但是需要满足我不确定如何实现的要求......

基本上,我将配置ELMAH在asp.net MVC下工作,并让它在发生错误时将错误记录到数据库中。除此之外,我将使用customErrors在发生错误时将用户定向到友好的消息页面。相当标准的东西......

要求是在此自定义错误页面上,我有一个表单,使用户可以根据需要提供额外信息。现在问题出现了,因为此时已经记录了错误,我需要将漏洞错误与用户反馈相关联。

通常情况下,如果我使用自己的自定义实现,在记录错误后,我会将错误的ID传递给自定义错误页面,以便建立关联。但是由于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可能会同时发出多个错误请求。但发生这种情况的可能性很小。而且这个解决方案独立于会话,在我们的例子中很重要,一些错误也会导致会话被终止等等。因此,为什么这种方法对我们来说很有效。

1 个答案:

答案 0 :(得分:8)

ELMAH中的ErrorLogModule(撰写本文时的版本1.1)提供了Logged事件,您可以在Global.asax中处理该事件,您可以使用该事件来传达详细信息,例如通过{{ 3}}收集,到您的自定义错误页面。如果您在ErrorLogModule中的ErrorLog名称下注册了web.config,则Global.asax中的事件处理程序将如下所示:

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