vNext中ABP的Exception的Http中的Status Code

对于ABP的文档中的说明,那个httpcode是不一定的,如果你用Volo.Abp.UserFriendlyException他返回的错误也有可能是401 403 500等,这对于前端来说就是个不确定值啊,所以我们给他修改下。

如果不采用AbpAuthorizationException则我们抛弃他,全部使用UserFriendlyException,因为他可以带上Code

定义一个全局错误过滤器,如下:

    public class ABCExceptionFilterAttribute : ExceptionFilterAttribute {

        private readonly ILogger<ABCExceptionFilterAttribute> _logger;
        public ABCExceptionFilterAttribute(ILogger<ABCExceptionFilterAttribute> logger) {
            _logger = logger;
        }
        public override void OnException(ExceptionContext context)
        {

            // 如果异常没有被处理则进行处理
            if (context.ExceptionHandled == false)
            {
                var userExpect = context.Exception as UserFriendlyException;
                var info = new ExceptionModel();
                info.error = new CustomBackModel();
                info.error.code = "500";
                info.error.success = false;
                info.error.message = "服务器遇到一个错误,无法继续为您服务!";

                if (userExpect != null)
                {
                    if (!String.IsNullOrEmpty(userExpect.Code))
                    {
                        info.error.code = userExpect.Code;
                    }
                    else
                    {
                        info.error.code = "502";
                    }
                    info.error.message = context.Exception.Message;
                }
                else {
                    var volexception = context.Exception as Volo.Abp.Validation.AbpValidationException;
                    if (volexception != null) {
                        info.error.code = "400";
                        info.error.message = volexception.Message;
                    }
                }
                //写入日志
                _logger.LogError(context.Exception, context.HttpContext.Request.Path,null);

                context.Result = new ContentResult
                {
                    // 返回状态码设置为200,表示成功
                    StatusCode = int.Parse(info.error.code),
                    // 设置返回格式
                    ContentType = "application/json;charset=utf-8",
                    Content = Newtonsoft.Json.JsonConvert.SerializeObject(info)
                };
            }
            // 设置为true,表示异常已经被处理了
            context.ExceptionHandled = true;

        }

        public override Task OnExceptionAsync(ExceptionContext context)
        {
            return base.OnExceptionAsync(context);
        }
    }

然后到入口处注册一下:

            context.Services.AddControllers(options => { options.Filters.Add(typeof(ABCExceptionFilterAttribute)); });

然后你就可以愉快的去其他地方throw new UserFriendlyExpection("错误信息","错误代码int类型")了,你也可以修改下,比如非httpcode,则写在返回内容中的error.code中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值