简介:我们将通过OnActionExecuted方法来实现,OnActionExecuted是ASP.NET Core MVC框架提供的一个过滤器接口方法,用于在控制器方法执行后对结果进行处理。
- 新建ApiResponseFilter.cs过滤器实现类,继承于IActionFilter类,ApiResponseFilter.cs类全部代码如下
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using MySqlX.XDevAPI.Common;
namespace EF_Core
{
public class ApiResponseFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.Exception != null)
{
// 如果发生异常,则返回统一的错误信息
context.Result = new ObjectResult(new ApiResponse
{
Success = false,
Message = context.Exception.Message,
StatusCode = 500
})
{
StatusCode = 500
};
context.ExceptionHandled = true;
}
else if (context.Result is ObjectResult result && result.StatusCode >= 200 && result.StatusCode < 300)
{
// 如果返回结果为ObjectResult且状态码为2xx,则将数据包装成ApiResponse对象
context.Result = new ObjectResult(new ApiResponse
{
Success = true,
Data = result.Value,
StatusCode = result.StatusCode.GetValueOrDefault(200)
})
{
StatusCode = result.StatusCode
};
}
else
{
// 如果状态码为null或者不是2xx,将默认状态码设置为200
context.Result = new ObjectResult(new ApiResponse
{
Success = true,
Data = (context.Result as ObjectResult)?.Value,
StatusCode = 200
})
{
StatusCode = 200
};
}
}
public void OnActionExecuting(ActionExecutingContext context)
{
// 在执行Action前的处理,可不实现
}
}
public class ApiResponse
{
public bool Success {
get; set; }
public string Message {
get; set; }
public object Data {
get; set; }
public int StatusCode {
get; set; }
}
}
2. 在Program.cs类中注册该过滤器。
builder.Services.AddControllers(options =>
{
options.Filters.Add(new ApiResponseFilter()); // 注册ApiResponseFilter
});
3. 测试返回