现在的开发模式很少用asp.net mvc一个项目直接操作界面和数据库了。大部分都使用前后端分离,更多的是为了让API支持移动端。

后端写webapi的时候必然需要和前端约定请求值和返回值的格式,如果有异常返回应该如何识别和区分;

通过actionfilter即可实现AOP切入处理,而不需要在每个方法中处理。

  /// <summary>
/// Api action统一处理过滤器
/// 处理正常返回值 {code:200,body:{}}
/// </summary>
public class ApiResponseFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
//模型验证
if (!context.ModelState.IsValid)
{
throw new ApplicationException(context.ModelState.Values.First(p => p.Errors.Count > 0).Errors[0].ErrorMessage);
}
base.OnActionExecuting(context);
} /// <summary>
/// 处理正常返回的结果对象,进行统一json格式包装
/// 异常只能交由ExceptionFilterAttribute 去处理
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuted(ActionExecutedContext context)
{
if (context.Result != null)
{
var result = context.Result as ObjectResult;
JsonResult newresult;
if (context.Result is ObjectResult)
{
newresult = new JsonResult(new { code = 200, body = result.Value });
}
else if (context.Result is EmptyResult)
{
newresult = new JsonResult(new { code = 200, body = new { } });
}
else
{
throw new Exception($"未经处理的Result类型:{ context.Result.GetType().Name}");
}
context.Result = newresult;
}
base.OnActionExecuted(context);
}
} /// <summary>
/// api异常统一处理过滤器
/// 系统级别异常 500 应用级别异常501
/// </summary>
public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
context.Result = BuildExceptionResult(context.Exception);
base.OnException(context);
} /// <summary>
/// 包装处理异常格式
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
private JsonResult BuildExceptionResult(Exception ex)
{
int code = 0;
string message = "";
string innerMessage = "";
//应用程序业务级异常
if (ex is ApplicationException)
{
code = 501;
message = ex.Message;
}
else
{
// exception 系统级别异常,不直接明文显示的
code = 500;
message = "发生系统级别异常";
innerMessage = ex.Message;
} if (ex.InnerException != null && ex.Message != ex.InnerException.Message)
innerMessage += "," + ex.InnerException.Message; return new JsonResult(new { code, message, innerMessage });
}
}

asp.net core webapi 统一处理返回值、异常和请求参数验证的更多相关文章

  1. ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)

    相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...

  2. ASP.NET Core搭建多层网站架构【11-WebApi统一处理返回值、异常】

    2020/02/01, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[11-WebApi统一处理返回值.异常] 使用I ...

  3. ASP.NET Core WebApi返回结果统一包装实践

    前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...

  4. asp.net core WebApi 返回 HttpResponseMessage

    ASP.NET WebApi 2 中的示例代码: [Route("values/{id}")] public async Task<HttpResponseMessage&g ...

  5. ASP.Net Core WebApi几种版本控制对比

    版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...

  6. Asp.Net Core WebAPI入门整理(三)跨域处理

    一.Core  WebAPI中的跨域处理  1.在使用WebAPI项目的时候基本上都会用到跨域处理 2.Core WebAPI的项目中自带了跨域Cors的处理,不需要单独添加程序包 3.使用方法简单 ...

  7. 使用 xUnit 编写 ASP.NET Core WebAPI单元测试

    本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...

  8. Asp.Net Core WebAPI入门整理(二)简单示例

    一.Core WebAPI中的序列化 使用的是Newtonsoft.Json,自定义全局配置处理: // This method gets called by the runtime. Use thi ...

  9. Asp.Net Core WebAPI入门整理(四)参数获取

    一.总结整理,本实例对应.Net Core 2.0版本 1.在.Net Core WebAPI 中对于参数的获取及自动赋值,沿用了Asp.Net  MVC的有点,既可以单个指定多个参数,右可以指定Mo ...

随机推荐

  1. 机器学习中的误差 Where does error come from?

    误差来自于偏差和方差(bias and variance)   对于随机变量 X,假设其期望和方差分别为 μ 和 σ2.随机采样 N 个随机变量构成样本,计算算术平均值 m,并不会直接得到 μ (除非 ...

  2. MySQL-EXPLAIN执行计划Extra解释

    EXPLAIN命令输出的列中Extra字段可选值较多,这里单独说一下. 该Extra列 EXPLAIN输出包含MySQL解决查询的额外信息.以下列表说明了此列中可能出现的值.每个项目还指示JSON格式 ...

  3. windows下通过idea连接hadoop和spark集群

    ###windows下链接hadoop集群 1.假如在linux机器上已经搭建好hadoop集群 2.在windows上把hadoop的压缩包解压到一个没有空格的目录下,比如是D盘根目录 3.配置环境 ...

  4. ArrayList用法整理

    System.Collections.ArrayList类是一个特殊的数组.通过添加和删除元素,就可以动态改变数组的长度. 一.优点 1.支持自动改变大小的功能 2.可以灵活的插入元素 3.可以灵活的 ...

  5. Scrum Master如何让敏捷团队正常运转?

    官方<Scrum指南>中定义:Scrum Master在Scrum团队中属于服务型领导,负责践行和支持<Scrum指南>中定义的Scrum,要帮团队的每个人理解Scrum理论. ...

  6. mysql数据库磁盘空间被撑爆,创建定时任务定期释放资源

    问题描述: 这是我在工作中遇到的一个问题,目前只发现mysql数据库存在该问题,Oracle和gaussDB未发现磁盘空间被占满的情况,部署堆栈服务的时候抛出了写入数据库表失败的问题,经排查,在数据库 ...

  7. Eclipse配置初始化(自用)

    以上都是性能调优的配置,下面是其他常用的配置和优化 设置utf-8编码 window -> preferences -> General -> workplace中text file ...

  8. jquery validate常用方法及注意问题

    1. required: true 值是必须的.required: "#aa:checked" 表达式的值为真,则需要验证.required: function(){} 返回为真, ...

  9. vue-cli报错:Class constructor FileManager cannot be invoked without 'new'

    bug:vue-cli3开发的项目,今天项目重新下载依赖启动项目的时候出现错误:Class constructor FileManager cannot be invoked without 'new ...

  10. C++中轻量级多线程openmp

    关于其概念及使用方法: https://baike.baidu.com/item/openmp/3735430?fr=aladdin