我使用ELMAH在ASP.NET Webforms应用程序中记录未处理的异常。记录工作正常。
我想将ELMAH错误日志ID传递给自定义错误页面,该页面将使用户能够通过电子邮件向管理员发送有关错误的信息。我遵循了this answer的建议。这是我的global.asax
代码:
void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
Session[StateKeys.ElmahLogId] = args.Entry.Id;
// this doesn't work either:
// HttpContext.Current.Items[StateKeys.ElmahLogId] = args.Entry.Id;
}
但是,在自定义错误页面上,会话变量引用和HttpContext.Current.Items给了我一个NullReference异常。如何将ID传递给我的自定义错误页面?
答案 0 :(得分:7)
这对我有用:
void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args)
{
if (args.Entry.Error.Exception is HandledElmahException)
return;
var config = WebConfigurationManager.OpenWebConfiguration("~");
var customErrorsSection = (CustomErrorsSection)config.GetSection("system.web/customErrors");
if (customErrorsSection != null)
{
switch (customErrorsSection.Mode)
{
case CustomErrorsMode.Off:
break;
case CustomErrorsMode.On:
FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect);
break;
case CustomErrorsMode.RemoteOnly:
if (!HttpContext.Current.Request.IsLocal)
FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect);
break;
default:
break;
}
}
}
void FriendlyErrorTransfer(string emlahId, string url)
{
Server.Transfer(String.Format("{0}?id={1}", url, Server.UrlEncode(emlahId)));
}
答案 1 :(得分:2)
无法对Ronnie的解决方案发表评论。我有一段时间,但它打破了标准的错误流程,导致ErrorLog_Logged总是转移,即使在调用时
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
如果你仍想在catch语句中记录错误,这是一个问题,例如你有一个错误的解决方法,但是想记录错误以执行正确的修复,这对于难以解决很有帮助重复问题。
我可以通过使用以下更改来纠正此问题:
//if (customErrorsSection != null)
if (customErrorsSection != null && this.Context.Error != null)
这正确地考虑了典型的错误处理,因为在你明确地在Elmah中引发异常的情况下context.Error将为null,但在通过默认错误处理(不通过catch或者如果被捕获并且重新获取)时不为null -thrown)。这导致Ronnie的解决方案响应类似于.Net错误处理逻辑。