现在的开发模式很少用asp.net mvc一个项目直接操作界面和数据库了。大部分都使用前后端分离,更多的是为了让API支持移动端。 后端写webapi的时候必然需要和前端约定请求值和返回值的
现在的开发模式很少用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 }); } }