异常处理中间件
在使用不同的异常处理方法进行了许多实验之后,我最终使用了中间件。对于我的ASP.NET Core Web
API应用程序,它表现得最好。它可以处理应用程序异常以及动作过滤器中的异常,并且我可以完全控制异常处理和HTTP响应。这是我的异常处理中间件:
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 pre = HttpStatusCode.InternalServerError; // 500 if unexpected if (ex is MyNotFoundException) pre = HttpStatusCode.NotFound; else if (ex is MyUnauthorizedException) pre = HttpStatusCode.Unauthorized; else if (ex is MyException) pre = HttpStatusCode.BadRequest; var result = JsonConvert.SerializeObject(new { error = ex.Message }); context.Response.ContentType = "application/json"; context.Response.StatusCode = (int)pre; return context.Response.WriteAsync(result); }}在课堂上 在MVC之前 注册
Startup:
app.UseMiddleware(typeof(ErrorHandlingMiddleware));app.UseMvc();
您可以添加堆栈跟踪,异常类型名称,错误代码或您想要的任何内容。非常灵活。这是异常响应的示例:
{ "error": "Authentication token is not valid." }考虑序列化响应对象以利用ASP.NET
MVC的序列化设置在所有端点之间实现更好的序列化一致性时,考虑注入
IOptions<MvcJsonOptions>该
Invoke方法,然后使用该方法
JsonConvert.SerializeObject(errorObj,opts.Value.SerializerSettings)。
方法2
UseExceptionHandler对于简单的方案,还有另一个非显而易见的API 可以正常工作:
app.UseExceptionHandler(a => a.Run(async context =>{ var feature = context.Features.Get<IExceptionHandlerPathFeature>(); var exception = feature.Error; var result = JsonConvert.SerializeObject(new { error = exception.Message }); context.Response.ContentType = "application/json"; await context.Response.WriteAsync(result);}));这不是设置异常处理的非常明显但简单的方法。但是,我仍然更喜欢中间件方法,因为我获得了更多控制权并具有注入必要依赖项的能力。



