.Net Core Web Api 中如何处理全局异常

使用场景

在请求Web Api的时候难免会碰到一些未处理的异常,此时服务器通常会返回500错误,为了更好的用户体验,我们需要捕获全局的未处理异常,并返回一个友好的错误信息给调用端。

解决方案

从.Net Core 开始,微软引入了中间件的概念,通过中间件我们可以拦截到所有的http请求,也可以捕获到所有未处理的异常。

  • 首先我们要定义一个中间件,如下:
public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger _logger;
    private readonly IHostEnvironment _host;

    public ExceptionHandlingMiddleware(
        RequestDelegate next,
        ILoggerFactory loggerFactory,
        IHostEnvironment host)
    {
        _next = next;
        _logger = loggerFactory.CreateLogger();
        _host = host;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleException(context, ex);
        }
    }

    private Task HandleException(HttpContext context, Exception exception)
    {
        _logger.LogError(exception, exception.Message);

        // 这里可以自定义返回类型
        var body = JsonSerializer.Serialize(new
        {
            message = exception.Message,
            stackTrace = _host.IsDevelopment() ? exception.StackTrace : string.Empty
        });

        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)HttpStatusCode.OK;
        return context.Response.WriteAsync(body);
    }
}

中间件就是普通的类,但是她包含了一个Invoke方法,这个也正是处理http请求的方法,我们可以在这里捕获异常并处理。

  • 接下来我们只要把该中间件注册到http管道中就可以了。

修改Startup如下:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMiddleware();

    //other middleware
}

注意顺序要在其他处理逻辑的中间件之前,否则也无法捕获到异常。

你可能感兴趣的:(Web,Api,c#,asp.net)