asp.net-mvc – ASP.NET MVC ELMAH没有记录HttpRequestValidationExceptions

我有一个在.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中的一个重大变化有关

见:
this link
this link

以下是我如何使用它:

        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()”方法有效.

点赞