目录
需求目标原理和思路实现验证总结参考资料需求
因为在项目中,会有各种各样的领域异常或系统异常被抛lExceptionMiddleware>(); return app; }}
验证
首先我们需要在Controller中包装我们的返回值,举一个CreateTodoList的例子,其他的类似修改:
TodoListController.cs
[HttpPost]public async Task<ApiResponse<Domain.Entities.TodoList>> Create([FromBody] CreateTodoListCommand command){ return ApiResponse<Domain.Entities.TodoList>.Success(await _mediator.Send(command));}还记得我们在TodoList的领域实体上有一个Colour的属性吗,它是一个值对象,并且在赋值的过程中我们让它有机会抛出一个UnsupportedColourException,我们就用这个领域异常来验证全局异常处理。
为了验证需要,我们可以对CreateTodoListCommand做一些修改,让它接受一个Colour的字符串,相应修改如下:
CreateTodoListCommand.cs
public class CreateTodoListCommand : IRequest<Domain.Entities.TodoList>{ public string? Title { get; set; } public string? Colour { get; set; }}// 以下代码位于对应的Handler中,省略其他...var entity = new Domain.Entities.TodoList{ Title = request.Title, Colour = Colour.From(request.Colour ?? string.Empty)};启动Api项目,我们试图以一个不支持的颜色来创建TodoList:
请求

响应

顺便去看下正常返回的格式是否按我们预期的返回,下面是请求所有TodoList集合的接口返回:

可以看到正常和异常的返回类型已经统一了。
总结
其实实现全局异常处理还有一种方法是通过Filter来做,具体方法可以参考这篇文章:Filters in ASP.NET Core,我们之所以不选择Filter而使用Middleware主要是基于简单、易懂,并且作为中间件管道的第一个个中间件加入,有效地覆盖包括中间件在内的所有组件处理过程。Filter的位置是在路由中间件作用之后才被调用到。实际使用中,两种方式都有应用。
下一篇我们来实现PUT请求。
参考资料
1.Write custom ASP.NET Core middleware
2.FicsQTljlters in ASP.NET Core








