ASP.NET Core中的统一结果返回与统一异常处理

在ASP.NET Core中,统一结果返回和统一异常处理是提高代码可读性和可维护性的重要手段。通过实施这些策略,我们可以确保API的响应格式一致,并能有效地处理程序中发生的异常。

一、统一结果返回

在ASP.NET Core Web API中,统一结果返回意味着无论请求成功还是失败,API总是以相同的格式返回数据。这有助于客户端解析和处理响应。

1. 定义返回结果模型

首先,我们可以定义一个简单的模型来表示API的返回结果。这个模型通常包含状态码、消息和可能的数据。

public class ApiResult<T>
{
    public int Code { getset; }
    public string Message { getset; }
    public T Data { getset; }
}

在这个模型中,Code 表示状态码,Message 是返回的消息,而 Data 是返回的数据。

2. 使用ActionFilter实现统一结果封装

我们可以创建一个自定义的 ActionFilter,在API方法执行后自动封装返回结果。

public class UnifiedResultFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // 可以在请求处理之前执行一些逻辑(如果需要)
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.Result is ObjectResult objectResult)
        {
            var result = objectResult.Value;
            var apiResult = new ApiResult<object>
            {
                Code = 200// 假设默认成功状态码为200
                Message = "Success"// 默认成功消息
                Data = result
            };
            context.Result = new ObjectResult(apiResult) { StatusCode = objectResult.StatusCode };
        }
    }
}

然后在Startup.cs(或Program.cs,取决于.NET Core的版本)中注册这个过滤器:

services.AddControllers(options =>
{
    options.Filters.Add(new UnifiedResultFilter());
});

二、统一异常处理

异常处理是确保应用程序稳定性和可用性的关键部分。在ASP.NET Core中,我们可以使用异常中间件或异常过滤器来实现统一异常处理。

1. 使用异常中间件

创建一个异常处理中间件,用于捕获并处理应用程序中发生的任何未处理的异常。

public class ExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;

    public ExceptionMiddleware(RequestDelegate next, ILogger logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "An unhandled exception has occurred while executing the request.");
            await HandleExceptionAsync(httpContext, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception)
    {
        var code = StatusCodes.Status500InternalServerError; // 你可以根据异常类型设置不同的状态码
        var message = "Internal Server Error"// 自定义错误消息
        var result = new ApiResult<object> { Code = code, Message = message };
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = code;
        return context.Response.WriteAsJsonAsync(result);
    }
}

在Startup.cs(或Program.cs)中注册这个中间件:

app.UseMiddleware();

确保它在其他中间件和MVC之前注册,以便它能够捕获任何后续中间件或MVC操作中抛出的异常。

2. 使用异常过滤器

另一种方法是使用异常过滤器来捕获控制器操作中抛出的异常。这可以通过实现 IExceptionFilter 接口来完成。

public class GlobalExceptionFilter : IExceptionFilterIDisposable
{
    public void OnException(ExceptionContext context)
    {
        // 记录异常信息(例如使用ILogger)...
        // 设置返回的结果和状态码等...
        context.Result = new ObjectResult(new ApiResult<object> { Code = 500, Message = "Internal Server Error" }) { StatusCode = 500 };
        context.ExceptionHandled = true// 标记异常已被处理,以避免进一步传播异常。
    }

    public void Dispose() { } // 如果需要处理资源释放,可以在这里实现。对于简单的过滤器,通常留空即可。
}

在Startup.cs(或Program.cs)中注册这个异常过滤器:

services.AddControllers(options =>
{
    options.Filters.Add(new GlobalExceptionFilter()); // 添加全局异常过滤器实例。
});

结论:

统一结果返回和统一异常处理是构建健壮且可维护的ASP.NET Core Web API的重要组成部分。通过实施这些策略,我们可以确保客户端始终接收到格式一致的响应,并能妥善处理服务端发生的任何异常。这有助于提升用户体验并增强系统的稳定性。


请使用浏览器的分享功能分享到微信等