【发布时间】:2019-08-11 12:16:37
【问题描述】:
如何在 .Net Core WebApi 中捕获来自控制器(或服务)的所有异常?
我的服务
public class MathService : IMathService
{
(...)
public double Divide(int x, int y)
{
return x / y;
}
(...)
}
我的控制器
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
(...)
// GET api/values
[HttpGet]
public ActionResult<double> Get()
{
return _math.Divide(7, 0);
}
}
我的中间件
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
if (ex is Exception) code = HttpStatusCode.BadRequest;
var result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
启动配置
(...)
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseMvc();
这应该足以捕获异常并返回带有错误的 JSON 消息吧?
我错过了什么?
谢谢
【问题讨论】:
-
确保中间件首先在管道中注册,它可以捕获下游的所有内容。
-
我猜您实际上要寻找的是自定义异常处理程序中间件。如果没有,那么你只想将用户重定向到自定义错误页面,然后在启动的配置方法中使用
app.UseExceptionHandler("/home/error"); -
@Dennis1679 我想返回一个 json 错误响应,用于 API,而不是视图。
-
@anibal 在这种情况下,如果发生错误,HTTP 500 状态代码对消费应用程序更具描述性和有用性。幸运的是,当您不向应用程序添加错误处理中间件时,这是默认行为。看,在最简单的情况下,您的整个应用程序充当另一个应用程序的 API,您可能会在没有任何错误处理中间件的情况下逃脱。但实际上,您可能希望确保使用中间件记录错误,但无论如何您肯定不需要在这种情况下更改响应正文。
标签: exception .net-core middleware