ASP.NET MVC/API - DELETE 方法未返回正确的响应

ASP.NET MVC / APIs - DELETE method not returning correct response

我有一个 DELETE 和 PUT 方法,它们包含相同的代码以从数据库中获取 ID 列表并在执行操作之前检查它们是否存在:

try
{
    var ids =
        (await _testTableTbRepository.GetAllAsync())
        .Select(_ => new TestTableTbModel { Id = _.Id }).OfType<int>().ToList();

    if (!ids.Contains(model.Id))
    {
        return StatusCode(400, "Id: " + model.Id + " does not exist");
    }

    await _testTableTbRepository.DeleteAsync(model.Id);
    return Ok(model.Id);
}
catch (Exception e)
{
    return StatusCode(500, e);
}

我的想法是 ID 到整数的转换没有正常工作,所以它一直被 if 语句捕获并返回 400 状态。有人看到这有什么问题吗?有没有更好的写法?

为什么这么麻烦?让DB帮你改用DBException

这样你就不会在你的内存中加载一个巨大的数据库并保存一个巨大的调用加上所有 select 并包含检查。

try
{
    await _testTableTbRepository.DeleteAsync(model.Id);
    return Ok(model.Id);
}
catch(DbException e)
{
   return StatusCode(404, "Id: " + model.Id + " does not exist");
}
catch (Exception e)
{
    return StatusCode(500, e);
}

感谢@Fran 指出 400 -> 404

我不确定 _testTableRepository 是如何实现的,但我假设它只是包装 EF 函数。

var exists = await _testTableRepository.FindAsync(model.Id);

if (!exists)
 return NotFound();

_testTableRepository.Delete(Model.Id);

return Ok(model.Id);

不要为 try catch 块而烦恼。大多数异常将自动转换为 500 响应代码。如果这就是您的 try/catch 所做的全部,只需让框架处理即可。

通过 id 查找您想要的记录也很容易。就像我说的那样,我假设您的存储库只是转发对 EF DbContext 的调用,它将有一个 FindAsync() 方法。