c# - 如何处理服务层不成功的请求?
问题描述
假设我有以下使用服务层的 rest api 端点:
[HttpGet("id")]
public async Task<IActionResult> GetById(int id)
{
var entity = _someService.GetById(id);
return Ok(entity);
}
而在服务方法中,用户没有权限访问该实体:
public Entity GetById(int id)
{
var entity = _repository.Get(id)
if(entity.OwnerId != CurrentUserId) // true
{
...
}
}
或者它根本不存在:
public Entity GetById(int id)
{
var entity = _repository.Get(id)
if(entity is null) // true
{
...
}
}
处理这种情况并通过在响应上设置合适的状态代码让用户知道出现问题的最佳方法是什么?
我能想到的是定义结果类,其中还包含请求结果,例如:
public class RequestResult<T>
{
public T Result {get; set;}
public int StatusCode {get; set;} // 200, 404, 403 ...
}
或者(我个人更喜欢)定义并抛出 ForbiddenException 或 NotFoundException 并通过设置合适的响应状态代码在 ExceptionHandlingMiddleware 中处理这些。
解决方案
处理这种情况并返回 403 或 404 的最佳方法是什么?
根据 hTTO 定义 404 - 未找到。
403 是被禁止的——这在一般安全性和 READ 操作方面没有意义。基本上:如果您不允许阅读它,通常也不允许您知道它是否存在。这是现在的标准 - 我不会告诉你密码错误,我会告诉你用户名或密码错误。我从不提供安全相关信息。
因此,然后将 403 隔离到允许您阅读但禁止更新(或删除)的更新操作。由于安全问题,不允许读取变成 404(未找到)。
推荐阅读
- swift - 将 Unity+Vuforia 集成到现有 iOS 项目使用户交互无法正常工作
- awk - 将参数列表作为从另一个制表符分隔的文件中提取的文件名
- android - 在没有第三方库的情况下,可以通过 React-Native 访问哪些硬件/传感器?
- ios - Swift CollectionView 获取第一个单元格
- eclipse - 安装 Eclipse Neon 错误
- python - 如何在 Jupyter 笔记本中显示蛋白质数据库 PDB?
- python - 如何根据python中的日期(mm-dd-yy中的形式)从数据集中选择行?
- php - php中字符串内的单双引号问题
- ios - Swift,iOS:如何从我的 firebase 数据库中提取数据?
- r - 递归特征消除和变量选择