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

8

我第一次考虑使用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;

请注意,这并不是完美的解决方案,因为同一IP可能在同一时间发出多个请求而出现错误。但这种情况发生的可能性很小。此解决方案与会话无关,在我们的情况下非常重要,因为某些错误可能会导致会话终止等。因此,这种方法对我们非常有效。

你解决了这个问题吗?我也遇到了同样的问题。我按照Atif的建议操作,但是当我在自定义错误页面引用HttpContext.Items获取Elmah Id时,出现了空引用异常。 - Ronnie Overby
@Ronnie Overby:请参见上面的编辑。 - vdh_ant
谢谢。我考虑过像那样做,但使用cookie/ipaddress组合作为标识符。最终我只是按照这个方法做了:https://dev59.com/mk3Sa4cB1Zd3GeqPzfPO#2906440 - Ronnie Overby
@Ronnie Overby:没问题,看起来这是个合理的方法……唯一的问题是我们想把异常(一个复杂的对象)传递到发生错误的页面。由于该系统是私有系统,如果所有记录失败,我们会告诉用户失败并将错误信息打印到页面源代码中。因此,如果需要,我们就可以访问它。 - vdh_ant
1个回答

9

ELMAH(截至本文版本1.1)中的ErrorLogModule提供了一个Logged事件,您可以在Global.asax中处理该事件,并且可以使用它来通过HttpContext.Items集合传递详细信息到自定义错误页面。如果您在web.config中将ErrorLogModule注册为ErrorLog,则Global.asax中的事件处理程序如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接