我有一个在.NET 4.0上运行的ASP.NET MVC站点,我正在尝试设置错误日志记录.
我发现了Elmah.MVC NuGet软件包(v2.1.1,Elmah核心:v1.2.1),并按照this tutorial进行了设置. (没做Step5 – javascript错误记录)
它工作正常并向我发送电子邮件和记录404错误,但是当我在输入中输入一些html< h1> Test< / h1>看看网站如何处理它我得到一个HttpRequestValidationException这是好的,因为它不会让他们输入它我有一个错误页面设置,当网站发布时显示,但Elmah没有记录这个细节有点错误.
我看了this SO post,Elmah issue 217说它已经解决了.
这是我的ElmahHandleErrorAttribute类:
public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
var e = context.Exception;
// Log only handled exceptions, because all other will be caught by ELMAH anyway.
// from http://ivanz.com/2011/05/08/asp-net-mvc-magical-error-logging-with-elmah/
// did nothing
// if (context.ExceptionHandled)
// ErrorSignal.FromCurrentContext().Raise(context.Exception);
if (!context.ExceptionHandled // if unhandled, will be logged anyhow
|| RaiseErrorSignal(e) // prefer signaling, if possible
|| IsFiltered(context)) // filtered?
return;
LogException(e);
}
private static bool RaiseErrorSignal(Exception e)
{
var context = HttpContext.Current;
if (context == null)
return false;
var signal = ErrorSignal.FromContext(context);
if (signal == null)
return false;
signal.Raise(e, context);
return true;
}
private static bool IsFiltered(ExceptionContext context)
{
var config = context.HttpContext.GetSection("elmah/errorFilter")
as ErrorFilterConfiguration;
if (config == null)
return false;
var testContext = new ErrorFilterModule.AssertionHelperContext(
context.Exception, HttpContext.Current);
return config.Assertion.Test(testContext);
}
private static void LogException(Exception e)
{
var context = HttpContext.Current;
ErrorLog.GetDefault(context).Log(new Error(e, context));
}
}
我在FilterConfig.cs中引用了哪些内容:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ElmahHandleErrorAttribute());
filters.Add(new HandleErrorAttribute());
}
是否有一个已知的解决方法,以便我可以让Elmah记录和发送这类错误的详细信息?
谢谢.
最佳答案 这个问题似乎与ASP.NET 4中的一个重大变化有关
以下是我如何使用它:
if (HttpContext.Current != null)
Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(e));
else
ErrorSignal.FromCurrentContext().Raise(e);
不知何故“Elmah.ErrorLog.GetDefault(HttpContext.Current).Log()”方法有效.