• 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预计能找到点东西

  • 相关阅读:
    NAT(网络地址转换)
    go从文件中读取json字符串并转换
    实现守护进程
    c++ uconcontext.h实现协程
    bzoj 1085骑士精神
    在线代码评测机
    基于时间轮的定时器
    内存管理(一)
    二叉树的先序中序后序(非递归)
    RDD操作
  • 原文地址:https://www.cnblogs.com/calvinK/p/4895462.html
Copyright © 2020-2023  润新知