Asp.net mvc覆盖基本控制器中的OnException一直传播到Application_Error

我想返回一个视图不会发出redirect到用户的基础上,可能会从我的应用程序发生的某些错误,我想处理错误+日志他们在我的基本控制器,我不想错误传播到我的Global.asax – Application_Error()方法,因为我想这个方法来处理我的应用程序内的任何其他错误,例如用户input一个虚假的URL,有没有人find解决办法?

注:我已经离开了我的评论代码,因为我有一些问题的解决方法,这也表明我有多个例外可能处理…

编辑:如果我在此OnException中发出RedirectToAction覆盖一切正常,但我只想返回视图,没有redirect…

我的基地控制器的方法是:

protected override void OnException(ExceptionContext filterContext) { //dont interfere if the exception is already handled if (filterContext.ExceptionHandled) return; //let the next request know what went wrong filterContext.Controller.TempData["exception"] = filterContext.Exception; //log exception _logging.Error(User.Identity.Name, ExceptionHelper.BuildWebExceptionMessage(filterContext.Exception)); //set up redirect to my global error handler //if (filterContext.Exception.GetType() == typeof(NoAccessException)) // filterContext.Result = View(new RouteValueDictionary // (new { area = "", controller = "Error", action = "PublicError" })); //else { //Only return view, no need for redirection filterContext.Result = View(new RouteValueDictionary (new { area = "", controller = "Error", action = "NoAccess" })); //} //advise subsequent exception filters not to interfere and stop // asp.net from showing yellow screen of death filterContext.ExceptionHandled = true; //erase any output already generated filterContext.HttpContext.Response.Clear(); //base.OnException(filterContext); } 

此方法应该处理任何其他可能出现在我的应用程序中的错误,我不希望上面的error handling我的Application_Error()

 protected void Application_Error() { Exception exception = Server.GetLastError(); // Log the exception. var logger = Container.Get<ILoggingService>(); logger.Error(User.Identity.Name, ExceptionHelper.BuildWebExceptionMessage(exception)); Response.Clear(); HttpException httpException = exception as HttpException; RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Error"); //if (httpException == null) //{ routeData.Values.Add("action", "PublicError"); //} //else //It's an Http Exception, Let's handle it. //{ // switch (httpException.GetHttpCode()) // { // case 404: // // Page not found. // routeData.Values.Add("action", "HttpError404"); // break; // case 500: // // Server error. // routeData.Values.Add("action", "HttpError500"); // break; // // Here you can handle Views to other error codes. // // I choose a General error template // default: // routeData.Values.Add("action", "General"); // break; // } //} // Pass exception details to the target error View. routeData.Values.Add("error", exception); // Clear the error on server. Server.ClearError(); // Avoid IIS7 getting in the middle Response.TrySkipIisCustomErrors = true; // Call target Controller and pass the routeData. IController errorController = new ErrorController(); errorController.Execute(new RequestContext( new HttpContextWrapper(Context), routeData)); } 

以下应该工作:

 protected override void OnException(ExceptionContext filterContext) { if (filterContext.ExceptionHandled) { return; } filterContext.Result = new ViewResult { ViewName = "~/Views/Shared/Error.aspx" }; filterContext.ExceptionHandled = true; } 

还要确保在这个方法中没有抛出exception,否则它将传播给Application_Error