1

我使用 Elmah 1.2 作为我的 asp.net mvc 4 应用程序的日志框架。

在 web.config 文件中,我将 customErrors 模式设置为 on。

<customErrors mode="On" defaultRedirect="/Error">
  <error statusCode="404" redirect="/Error/NotFound" />
</customErrors>

我还创建了一个自定义 HandleErrorAttribute,从这个链接复制了代码。

http://joel.net/logging-errors-with-elmah-in-asp.net-mvc-3--part-4--handleerrorattribute

在我的 Home 控制器中,我只是抛出一个异常来测试日志框架。

    public ActionResult About()
    {
        throw new Exception("this is a buggggggggggggg");

        ViewBag.Message = "Your app description page.";

        return View();
    }

“这是一个buggggggggggggg”记录在数据库中,很好,它有效。然后还记录了另一个错误,我没想到会发生这种情况。

未找到视图“错误”或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下位置:~/Views/Home/Error.aspx ~/Views/Home/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/Home/Error。 cshtml ~/Views/Home/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

更新:

按照蒂姆的建议,那么它会导致另一个问题。

如果我在共享文件夹中创建一个 Error.cshtml。当发生未处理的异常时,它将显示此 Error.cshtml 文件,而不是“/Error”页面。我启用了 customErrors。它们都应该被重定向到“/Error”页面。

4

2 回答 2

3

我们创建了一个空的 MVC5 应用程序并向其中添加了 ELMAH。即使我们没有添加 HandleErrorAttribute,我们也收到了您描述的额外错误。经过一番研究,我发现了 nuget 包Elmah.MVC,它添加了一些额外的配置设置。在您的appSettings部分中,web.config您将找到以下 2 行:

<appSettings>
    <add key="elmah.mvc.disableHandler" value="false" />
    <add key="elmah.mvc.disableHandleErrorFilter" value="false" />
</appSettings>

这 2 个键默认为“false”。我将它们的值更改为“true”,额外记录的异常消失了。

于 2015-03-08T04:45:33.213 回答
2

我正在使用 ASP.NET MVC 5 RC 开发应用程序,并且我也使用 Elmah 进行错误记录。我也在使用自定义错误处理属性将错误重定向到自定义控制器上的自定义操作,但我的看起来不像您提供的链接中显示的那样。

但是我遇到了同样的问题:Elmah 正确记录了错误,但还添加了“找不到错误视图”条目。我通过在属性的 OnException 方法中添加以下行来解决这个问题:

filterContext.ExceptionHandled = true;

为了完整起见,这是我正在使用的自定义错误处理属性的完整代码:

public class CustomHandleErrorAttribute: HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;

        if(filterContext.HttpContext.Request.IsAjaxRequest()) {
            filterContext.HttpContext.Response.StatusCode = 
                (int)HttpStatusCode.InternalServerError;
            filterContext.Result = new ContentResult() {
                Content = "Server error",
                ContentType = "text/plain"
            };
        }
        else {
            filterContext.Result = new RedirectToRouteResult(
                "Default",
                new System.Web.Routing.RouteValueDictionary(new
                {
                    controller = "Error",
                    action = "ApplicationError"
                }));
        }
    }
}
于 2013-10-07T10:44:52.080 回答