asp.net mvc HandleErrorAttribute 异常错误处理 无效!

系统未知bug,代码没有深究。 

现象:filters.Add(new HandleErrorAttribute()); 使用了全局的异常处理过滤。

HandleErrorAttribute 核心代码:

public virtual void OnException(ExceptionContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }
            if (filterContext.IsChildAction)
            {
                return;
            }
            if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            {
                return;
            }
            Exception exception = filterContext.Exception;
            if (new HttpException(null, exception).GetHttpCode() != 500)
            {
                return;
            }
            if (!this.ExceptionType.IsInstanceOfType(exception))
            {
                return;
            }
            string controllerName = (string)filterContext.RouteData.Values["controller"];
            string actionName = (string)filterContext.RouteData.Values["action"];
            HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
            filterContext.Result = new ViewResult
            {
                ViewName = this.View,
                MasterName = this.Master,
                ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                TempData = filterContext.Controller.TempData
            };
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
View Code

 经过测试,下面这些代码执行完成之后,页面还是显示黄页黄页。而不是系统 默认的Error视图

web.config中配置:customErrors mode="RemoteOnly"

 filterContext.ExceptionHandled = true;
 filterContext.HttpContext.Response.Clear();
 filterContext.HttpContext.Response.StatusCode = 500;
 filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;

有一个项目情况一定是这样的,其他好几个项目正常。

修复代码如下,使用自定义类继承自HandleErrorAttribute  重写方法OnException

加入代码

base.OnException(filterContext);
if (filterContext.ExceptionHandled)
filterContext.HttpContext.ClearError();

关键代码:filterContext.HttpContext.ClearError().

具体原因不明,还有待查证,那位大哥有碰到过??? 猜测可能和httpcontext最后执行的逻辑判断有问题,比如config的配置,运行时参数的不一致等

 

回家查看asp.net的源代码去,找找ExceptionHandled预计能找到点东西

posted @ 2015-10-20 17:44  czd890  阅读(1853)  评论(3编辑  收藏  举报