asp.net core webapi 统一处理返回值、异常和请求参数验证
2019-09-04 16:55
2161 查看
现在的开发模式很少用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 返回统一格式参数(Json 中 Null 替换为空字符串)
- 详解ASP.NET Core WebApi 返回统一格式参数
- ASP.NET Core WebApi 返回统一格式参数
- 详解ASP.NET Core WebApi 返回统一格式参数
- 用asp.net编写页面,GridView控件中update存在问题,指定的参数已超出有效值的范围。 参数名: index 说明: 执行当前 Web 请求期间,出现未经处理的异常。跪求大佬
- ASP.NET Core 统一异常处理和返回
- 用Middleware给ASP.NET Core Web API添加自己的授权验证
- 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现
- Asp.net Core WebApi 全局异常类
- 如何测量并报告ASP.NET Core Web API请求的响应时间
- 用Middleware给ASP.NET Core Web API添加自己的授权验证
- ASP.NET Core Web APi获取原始请求内容
- ASP.NET Core WEBAPI 模型验证 验证特性自定义返回
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- 自动化CodeReview - ASP.NET Core请求参数验证
- ASP.NET Core WebApi中使用FluentValidation验证数据模型
- ASP.NET Core WebApi中使用FluentValidation验证数据模型
- ASP.NET Core WebApi中使用FluentValidation验证数据模型的方法
- 【SpringBoot】web进阶——表单验证,AOP统一处理请求日志,统一异常处理,单元测试
- 循序渐进学.Net Core Web Api开发系列【14】:异常处理