我肯定会推荐 ELMaH,而不是自己编写此代码,也可以通过 Log4Net 为您的 MVC 应用程序编写代码。我个人避免任何异常处理,除非我对它有特定的功能响应。通过这种方式,我不会“吃掉”任何应用程序范围的工具(如 ELMaH)将为我优雅地处理的错误。
ELMaH 也有很好的内置网络报告,并且有专门用于 ELMaH 的第三方工具可以为您提供统计信息,例如最常见的错误。
您可以从自定义错误重定向开始...
<customErrors defaultRedirect="~/site/error" mode="RemoteOnly">
<error statusCode="404" redirect="~/site/notfound" />
</customErrors>
...对于知道您正在使用 ELMaH 的控制器...
public virtual ActionResult Error() {
System.Collections.IList errorList = new System.Collections.ArrayList();
ErrorLog.GetDefault(System.Web.HttpContext.Current).GetErrors(0, 1, errorList);
ErrorLogEntry entry = null;
if (errorList.Count > 0) {
entry = errorList[0] as Elmah.ErrorLogEntry;
}
return View(entry);
}
...由帮助访问者向您获取特定错误 ID 的视图提供支持:
@model Elmah.ErrorLogEntry
@if (Context.User.Identity.IsAuthenticated) {
<p>Since you are signed in, we've noted your contact information,
and may follow up regarding this to help improve our product.</p>
} else {
<p>Since you aren't signed in, we won't contact you regarding this.</p>
}
<p>Error ID: @Model.Id</p>
我还注意到在这个例子中这是一个 HttpPost。如果您正在使用 AJAX,那么您将希望以独特的方式处理错误。选择一个标准响应,您可以将其发送到所有 AJAX 代码都能正常处理的浏览器。也许通过在 javascript 警报中显示 ELMaH 错误 ID(作为一个简单的示例)。
我还通过 Global.asax 处理了一些特殊类型的 AJAX 错误:
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302 &&
Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
HandleErrorAttribute 是一个不错的功能,但众所周知,将它与 ELMaH 结合使用需要额外的工作。如何让 ELMAH 与 ASP.NET MVC [HandleError] 属性一起使用?