asp.net core webapi 统一处理返回值、异常和请求参数验证
发布时间:2020-12-16 09:28:23 所属栏目:asp.Net 来源:网络整理
导读:现在的开发模式很少用asp.net mvc一个项目直接操作界面和数据库了。大部分都使用前后端分离,更多的是为了让API支持移动端。 后端写webapi的时候必然需要和前端约定请求值和返回值的格式,如果有异常返回应该如何识别和区分; 通过actionfilter即可实现AOP切
现在的开发模式很少用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 – 是否可以通过Windows服务中的自托管Web API提供
- asp.net-mvc – 更改MVC4上的基本视图类型
- asp.net – 在web.config或数据库中存储配置设置
- 如何在Asp.Net页面中包含Javascript文件
- asp.net-membership – 如果我使用aspnet_membership有什么
- asp.net-mvc – MVC模型中的数据库查询
- 从ASP.NET 3.5应用程序在IFRAME中运行GWT应用程序(包括Appl
- asp.net-web-api2 – 创建新的IHttpActionResult动作结果方
- asp.net – .net http处理程序重定向到rtmp和flex
- entity-framework – EF Core:内置Created和Edited时间戳