Asp.net mvc 在基本控制器中覆盖 OnException 不断传播到 Application_Error
Posted
技术标签:
【中文标题】Asp.net mvc 在基本控制器中覆盖 OnException 不断传播到 Application_Error【英文标题】:Asp.net mvc override OnException in base controller keeps propagating to Application_Error 【发布时间】:2011-09-13 12:58:05 【问题描述】:我正在尝试返回一个视图,而不是根据我的应用程序可能发生的某些错误向用户发出重定向,我想处理错误并将它们记录在我的基本控制器中,我不希望错误传播直到我的 Global.asax - Application_Error() 方法,因为我希望此方法能够处理我的应用程序中的任何其他错误,例如用户输入了一个虚假的 URL,有没有人找到解决方法?
注意:我留下了我的注释代码,因为我有一些问题的解决方法,这也表明我有多个可能处理的异常......
编辑:如果我在此 OnException 覆盖内发出 RedirectToAction,一切都会按预期工作,但我只想返回视图而不是重定向...
我的基本控制器方法是:
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);
此方法应处理可能出现在我的应用程序中的任何其他错误,我不希望在我的 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));
【问题讨论】:
【参考方案1】:以下应该有效:
protected override void OnException(ExceptionContext filterContext)
if (filterContext.ExceptionHandled)
return;
filterContext.Result = new ViewResult
ViewName = "~/Views/Shared/Error.aspx"
;
filterContext.ExceptionHandled = true;
还要确保在这个方法中没有抛出异常,否则它会传播到Application_Error
。
【讨论】:
URL 会保持原来的样子吗...???这就是我试图通过上面的方法实现的,即如果发生错误,相关视图将被发回并且 url 保持不变/ url 不会改变...... @Haroon,绝对是的,它会保持不变。它将是导致异常的初始 url,除了将呈现自定义视图而不是黄屏死机。 可能我的问题很愚蠢......但谁能告诉我这个OnException()
(上面的代码)将被放置在应用程序中的哪里。在任何controller
类或global.ascx.cs
中。在哪里?
@bluesky OnException() 是控制器类的一部分,可以被覆盖。
我发现设置了一些其他属性,例如视图数据(HandleErrorInfo
类型的模型),响应代码也很有帮助devproconnections.com/aspnet-mvc/…以上是关于Asp.net mvc 在基本控制器中覆盖 OnException 不断传播到 Application_Error的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC - 在基本控制器中为母版页设置 ViewData