我正在努力使用两种方法来返回HttpStatusCode.NotFound(和其他Http状态代码)。
1。)我的应用服务将抛出一个RestException(HttpStatusCode code)
,它被中间件捕获,然后发回一个正确的响应并设置响应代码。例如,如果我有[Httpget]GetEmployeeById(int Id)
且Id不是真正的员工ID,请回复404。
2.。)在我的控制器中,对GetByEmployee()
的Application Service调用可能返回null,如果是,我return NotFound()
与中间件相同。但相反,这是在控制器中完成的,应用程序服务仍然不知道http状态代码。
RestException优点:
PutEmployee(Employee employeeToUpdate)
的动作,我不再需要先写入额外的逻辑来确定它是否存在,传递被跟踪的实体等等。应用服务处理所有这些。在Controller Pros中返回代码:
Employee
或NotFound()
我不需要[ProducesResponseType(typeof(FluentValidationDataTableFieldError), StatusCodes.Status400BadRequest))]
,因为这可以推断出来。基本上,它是以下片段之间的区别:
[HttpPost("", Name = EmployeeControllerRoute.PostEmployee)]
[ProducesResponseType(typeof(EmployeeCreateUpdateJsonModel), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(SpecialErrorViewModel), StatusCodes.Status400BadRequest)]
public async Task<EmployeePageJsonViewModel> Post([FromBody]EmployeeCreateUpdateJsonModel employeeToAdd)
=> await _employeeService.AddAsync(employeeToAdd); // AddAsync throws `RestException(HttpStatusCode code)` if `employeeToAdd.Id` does not pull up a real item.
[HttpGet("{productIds}", Name = ProductControllerRoute.GetProducts)]
public async Task<ActionResult<List<ProductViewModel>>> Get(EntityIdList productIds)
{
var products = await _productService.GetMultipleByIdAsync(productIds);
if(products.Count != productIds.Count)
{
return NotFound();
}
return products;
}