ELMAHを初めて使用することを検討していますが、達成する方法がわからないという要件を満たす必要があります...
基本的に、ASP.net MVCで動作するようにELMAHを構成し、エラーが発生したときにデータベースにログを記録するようにします。さらに、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で複数のリクエストが同時にエラーになる可能性があるため、これは100%完全ではないことに注意してください。しかし、その出来事の可能性のあるフードは遠いです。そして、このソリューションはセッションから独立しています。これは私たちの場合は重要です。また、いくつかのエラーによってセッションが終了するなどの原因になる可能性があります。したがって、このアプローチがうまく機能した理由です。