找不到错误页面,使用自定义错误页面抛出ELMAH错误

sol*_*dau 11 c# elmah asp.net-mvc-4

我对Global.asax做了一些修改,以便我可以显示自定义错误页面(403,404和500)这是代码:

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

        protected void Application_Error(object sender, EventArgs e)
        {
            if (Context.IsCustomErrorEnabled)
            {
                ShowCustomErrorPage(Server.GetLastError());
            }
        }

        private void ShowCustomErrorPage(Exception exception)
        {
            HttpException httpException = exception as HttpException;
            if (httpException == null)
            {
                httpException = new HttpException(500, "Internal Server Error", exception);
            }

            Response.Clear();
            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            routeData.Values.Add("fromAppErrorEvent", true);

            switch (httpException.GetHttpCode())
            {
                case 403:
                    routeData.Values.Add("action", "AccessDenied");
                    break;

                case 404:
                    routeData.Values.Add("action", "NotFound");
                    break;

                case 500:
                    routeData.Values.Add("action", "ServerError");
                    break;

                default:
                    routeData.Values.Add("action", "DefaultError");
                    routeData.Values.Add("httpStatusCode", httpException.GetHttpCode());
                    break;
            }

            Server.ClearError();

            IController controller = new ErrorController();
            controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        }
    }
Run Code Online (Sandbox Code Playgroud)

我还在Web上添加了以下内容.Config:

<customErrors mode="On">
    <!-- There is custom handling of errors in Global.asax -->
</customErrors>
Run Code Online (Sandbox Code Playgroud)

自定义错误页面正确显示,ELMAH将正确记录(故意)抛出的错误.但ELMAH还会捕获并记录一个额外的错误:

System.InvalidOperationException: The view 'Error' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/account/Error.aspx ~/Views/account/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/account/Error.cshtml ~/Views/account/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml
Run Code Online (Sandbox Code Playgroud)

我的第一直觉导致我HandleErrorAttribute在过滤器配置中禁用了全局.并且,类似的SO问题,例如:自定义错误页面的MVC问题让我相信我的怀疑是正确的.但即使在禁用全局后,HandleErrorAttribute我仍然得到错误,无法找到错误视图!是什么赋予了?我唯一的另一个预感是我的基础控制器来源于System.Web.Mvc.Controller 我试图检查源,看看是否HandleErrorAttribute应用System.Web.Mvc.Controller但无法收集任何东西......

更新:我试图覆盖我的基本控制器来标记异常,如下所示:

protected override void OnException(ExceptionContext filterContext)
{
    filterContext.ExceptionHandled = true;
    base.OnException(filterContext);
}
Run Code Online (Sandbox Code Playgroud)

但这并没有解决问题.

UPDATE2:我将一个Error.aspx文件放入共享视图中,只是为了看看会发生什么.当它在那里时,ELMAH记录强制异常,然后共享视图被提供 - 它永远不会到达Application_Error() ....不太确定该怎么做.

sol*_*dau 27

终于让它让我满意......

Elmah.Mvc包应用"隐藏"错误处理程序.我已通过在web.config中添加以下行来禁用此功能<appSettings>(默认情况下,该值从nuget install设置为"false")

<add key="elmah.mvc.disableHandleErrorFilter" value="true" />
Run Code Online (Sandbox Code Playgroud)

所以,现在我的错误传播到Application_Error并由Elmah记录,绕过Elmah过滤器,并显示正确的错误页面(不是/shared/error.cshtml中的错误页面)

  • 另外,请确保从FilterConfig中删除了默认的MVC错误处理程序 (4认同)