MVC覆盖OnException错误:找不到合适的方法来覆盖

时间:2015-09-17 16:20:26

标签: asp.net-mvc-3 error-handling

我试图在Global.asax中覆盖OnException来处理错误并写入日志。我不确定哪个部分出错了,我继续收到错误" MyApp.MvcApplication.OnException(System.Web.Mvc.ExceptionContext)':找不到合适的方法来覆盖"每当我重建我的解决方案。

这是我在Application_Start()

中的代码
 protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

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

这是我在OnException()

中的代码
protected override void OnException(ExceptionContext context)
    {
        Exception ex = context.Exception;

        if (!string.IsNullOrEmpty(ex.Message) ||
            !string.IsNullOrEmpty(ex.Source.ToString()) ||
            !string.IsNullOrEmpty(ex.StackTrace))
        {                

            WriteLog(ex.Message.ToString(), ex.StackTrace.ToString(), ex.Source.ToString(), "0");

            context.Result = new ViewResult
            {
                ViewName = String.Format("~/ErrorPage/ErrorPage?message={0}&stack={1}&source={2}", HttpUtility.UrlEncode(ex.Message), HttpUtility.UrlEncode(ex.StackTrace), HttpUtility.UrlEncode(ex.Source))
            };
        }

        context.ExceptionHandled = true;
    }

WriteLog()函数在其他应用程序中进行了测试,我不认为它有任何问题,我甚至尝试过:

protected override void OnException(ExceptionContext context) {
    Exception ex = context.Exception;

    context.Result = new ViewResult
            {
                ViewName = "~/Shared/Error.cshtml";
            };
    context.ExceptionHandled = true;
}

但没有任何效果。错误就在那里。

怎么会出现这样的问题,我该如何解决?我读了很多关于这个的教程,我不认为我错误地拼写了OnException()。

请帮忙。感谢

2 个答案:

答案 0 :(得分:2)

OnException

内没有Global.asax

您有两种方式:

创建您自己的HandleErrorAttribute并注册FilterConfig.cs

public class HandleExceptionsAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        (...)
    }
}

FilterConfig.cs:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleExceptionsAttribute());
    (...)
}

或者,如果您有一个BaseController,其中所有控制器都是继承的,则覆盖OnException方法。

PS:我会选择过滤器。

答案 1 :(得分:0)

全局asax中没有方法OnException,该方法属于controllers.to处理全局asax中的错误使用方法 Application_Error(object sender,EventArgs e)