Abp中在新版本中,抛出的异常(比如:UserFriendlyException)通过AjaxResponse封装后返回的时候,HttpStatusCode默认指定成了500。
对于一些默认封装好的处理Http请求的组件,有一部分是不支持开发者去处理这个500以上的错误信息的,或者这个错误码对于一些前端开发来说很困惑。
因为一般500的错误都是服务器发生了异常,被动的抛出的一个错误,在很多客户端是不给用户展示的,所以一些HttpClient对500以上的错误就默认处理,提示发生服务器内部错误,在自己内部消化了这个错误导致开发人员不能自由的处理Http请求。
当然处理这个错误的最便捷方式,就是换一个Http Client不就可以了。
嗯,确实换一个就好了。
不过这里笔者本着研究学习的态度,还是找到了另一个方式处理这个问题,就是自定义HttpStatusCode。
 
在Abp中,处理错误请求是通过ExceptionFilter来处理的,如下图的两个方法就是需要我们改造的方法。
看下GetStatusCode的源码:
最后这个代码可以看到,ABP默认错误返回了500。
 
修改方法:
(1)添加一个CustomeException.cs,继承UserFriendlyException,添加一个属性HttpCode.
/// <summary>
/// 自定义错误状态吗
/// </summary>
public class CustomeException : UserFriendlyException
{
public CustomeException(int code, string message, string details)
: this((int)HttpStatusCode.BadRequest, code, message, details)
{
} public CustomeException(HttpStatusCode httpCode, int code, string message, string details)
: this((int)httpCode, code, message, details)
{
} public CustomeException(int httpCode, int code, string message, string details)
: base(code, message, details)
{
HttpCode = httpCode;
}
/// <summary>
/// http 状态码
/// </summary>
public int HttpCode { get; set; }
}
(2)添加CustomeApiExceptionFilterAttribute,继承AbpApiExceptionFilterAttribute,然后重写GetStatusCode方法。
public class CustomeApiExceptionFilterAttribute : AbpApiExceptionFilterAttribute, ITransientDependency
{
public CustomeApiExceptionFilterAttribute(IAbpWebApiConfiguration configuration) : base(configuration)
{
} protected override HttpStatusCode GetStatusCode(HttpActionExecutedContext context)
{
var customException = (context.Exception as CustomeException);
if (customException != null)
{
return
(HttpStatusCode)customException.HttpCode;
}
else
{
return base.GetStatusCode(context);
}
} public void UseThis()
{
var filters = Configuration.HttpConfiguration.Filters;
var filterInfo = filters.FirstOrDefault(h => h.Instance is AbpApiExceptionFilterAttribute);
if (filterInfo != null) {
filters.Remove(filterInfo.Instance);
} filters.Add(this);
}
}
 
(3)替换原来的ExceptionFilter。在WebApiModule中初始化方法中调用UseThis方法。
最终的代码目录:
 
上面的代码简单,就不写注释了。
以上三个步骤之后,在代码中抛出CustomeException就可以自定义httpStatusCode了。

Abp中自定义Exception的HttpStatusCode的更多相关文章

  1. ABP中的拦截器之ValidationInterceptor(下)

    在上篇我分析了整个ABP中ValitationInterceptor的整个过程,就其中涉及到的Validator过程没有详细的论述,这篇文章就这个过程进行详细的论述,另外任何一个重要的特性如何应用是最 ...

  2. ABP中的Filter(下)

    接着上面的一个部分来叙述,这一篇我们来重点看ABP中的AbpUowActionFilter.AbpExceptionFilter.AbpResultFilter这三个部分也是按照之前的思路来一个个介绍 ...

  3. ABP中的Filter(上)

    这个部分我打算用上下两个部分来将整个结构来讲完,在我们读ABP中的代码之后我们一直有一个疑问?在ABP中为什么要定义Interceptor和Filter,甚至这两者之间我们都能找到一些对应关系,比如: ...

  4. ABP源码分析四十七:ABP中的异常处理

    ABP 中异常处理的思路是很清晰的.一共五种类型的异常类. AbpInitializationException用于封装ABP初始化过程中出现的异常,只要抛出AbpInitializationExce ...

  5. ABP中的拦截器之AuditingInterceptor

    在上面两篇介绍了ABP中的ValidationInterceptor之后,我们今天来看看ABP中定义的另外一种Interceptor即为AuditingInterceptor,顾名思义就是一种审计相关 ...

  6. ABP中的拦截器之ValidationInterceptor(上)

    从今天这一节起就要深入到ABP中的每一个重要的知识点来一步步进行分析,在进行介绍ABP中的拦截器之前我们先要有个概念,到底什么是拦截器,在介绍这些之前,我们必须要了解AOP编程思想,这个一般翻译是面向 ...

  7. ABP源码分析三十五:ABP中动态WebAPI原理解析

    动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类就可以对外提供WebAPI的功能, ...

  8. ABP中使用Redis Cache(1)

    本文将讲解如何在ABP中使用Redis Cache以及使用过程中遇到的各种问题.下面就直接讲解使用步骤,Redis环境的搭建请直接网上搜索. 使用步骤: 一.ABP环境搭建 到http://www.a ...

  9. ABP中动态WebAPI原理解析

    ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类 ...

随机推荐

  1. C++标准库之右值引用与交付语义

    C++标准委员会不应该制定一条阻止程序员拿起枪朝自己的脚丫子开火的规则. 右值引用(rvalue).交付语义(move) 最近阅读<C++标准库第二版>,看到第二章介绍C++11新特性3. ...

  2. Spring AOP配置方式

    AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...

  3. tensorflow学习之(二)Seesion的两种打开模式

    #Seesion的两种打开模式 import tensorflow as tf matrix1 = tf.constant([[3,3]])#一行两列的一个矩阵 matrix2 = tf.consta ...

  4. 移动端300ms延迟解决的几种方法;

    方案一:禁用缩放 当HTML文档头部包含如下meta标签时: <meta name="viewport" content="user-scalable=no&quo ...

  5. Spring配置Bean,为属性赋值

    SayHello的实体类: package com.langchao; /** * @ClassName: SayHello * @description: * @author: ZhangYawei ...

  6. C#延时函数

    用Thread方法: 先using system.threading; 再在需要延时的进程处插入 thread.sleep(int);

  7. Rabbit mq 简单应用

    参考:http://rabbitmq.mr-ping.com/AMQP/AMQP_0-9-1_Model_Explained.html 简答模式(exchange不工作) import pika # ...

  8. EF6学习笔记(四) 弹性连接及命令拦截调试

    EF6学习笔记总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本章原文地址:Connection Resiliency and Command Interception 原文 ...

  9. 基于esp32的IIC通讯

    本文源码地址在:http://download.csdn.net/download/noticeable/9962029 IIC 通讯应该是当代比较常用的几种通讯方式之一,其无需特殊的IO接口,连线方 ...

  10. Visual Studio 2017 调试器的工作进程(msvsmon.exe)意外退出 调试将终止

    开发环境: Windows 10 in Parallels Desktop Visual Studio 15.6 场景还原: 使用 Visual Studio 15.6 (即 Visual Studi ...