2020/02/01, ASP.NET Core 3.1, VS2019html
摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构【11-WebApi统一处理返回值、异常】
使用IExceptionFilter过滤器实现异常统一处理,使用IResultFilter过滤器实现统一处理返回值git
文章目录github
此分支项目代码后端
本章节介绍了使用IExceptionFilter实现异常统一处理,使用IResultFilter实现统一处理返回值api
在MS.WebApi
应用程序中新建Filters文件夹,在该文件夹下新建ApiExceptionFilter.cs
类:服务器
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Logging; using MS.Component.Aop; namespace MS.WebApi.Filters { /// <summary> /// api异常过滤器 /// </summary> public class ApiExceptionFilter : IExceptionFilter { private readonly ILogger<ApiExceptionFilter> _logger; public ApiExceptionFilter(ILogger<ApiExceptionFilter> logger) { _logger = logger; } public void OnException(ExceptionContext context) { string methodInfo = $"{context.RouteData.Values["controller"] as string}Controller.{context.RouteData.Values["action"] as string}:{context.HttpContext.Request.Method}"; //若是不是AopHandledException异常,则可能没有记录过日志,进行日志记录 if (!(context.Exception is AopHandledException)) { _logger.LogError(context.Exception, "执行{0}时发生错误!", methodInfo); } context.Result = new JsonResult(new { status = 501, data = "服务器出错" }); } } }
若是controller在执行过程当中遇到错误,则会被过滤器捕获到,若是错误已经被LogAop(以前写的业务层的)处理过,那在ApiExceptionFilter中判断下就不处理了,最后统一返回501,提示服务器出错架构
在Filters文件夹下新建ApiResultFilter.cs
类:mvc
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; namespace MS.WebApi.Filters { /// <summary> /// 给api返回结果包一层状态码 /// </summary> public class ApiResultFilter : IResultFilter { public void OnResultExecuting(ResultExecutingContext context) { if (context.Result != null) { if (context.Result is ObjectResult objectResult) { if (objectResult.DeclaredType is null) //返回的是IActionResult类型 { context.Result = new JsonResult(new { status = objectResult.StatusCode, data = objectResult.Value }); } else//返回的是string、List这种其余类型,此时没有statusCode,应尽可能使用IActionResult类型 { context.Result = new JsonResult(new { status = 200, data = objectResult.Value }); } } else if (context.Result is EmptyResult) { context.Result = new JsonResult(new { status = 200, data = "" }); } else { throw new Exception($"未经处理的Result类型:{ context.Result.GetType().Name}"); } } } public void OnResultExecuted(ResultExecutedContext context) { } } }
Startup.cs
类中,给AddControllers方法添加参数:网站
services.AddControllers(options => { options.Filters.Add<ApiResultFilter>(); options.Filters.Add<ApiExceptionFilter>(); });
将services.AddControllers();
改为以上内容:
spa
至此,过滤器已应用成功,启动项目,打开Postman调用接口:
能够看到返回值已经包了一层
项目完成后,以下图所示