首页 > 解决方案 > 如何处理服务层不成功的请求?

问题描述

假设我有以下使用服务层的 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 中处理这些。

标签: c#asp.net-corearchitecture

解决方案


处理这种情况并返回 403 或 404 的最佳方法是什么?

根据 hTTO 定义 404 - 未找到。

403 是被禁止的——这在一般安全性和 READ 操作方面没有意义。基本上:如果您不允许阅读它,通常也不允许您知道它是否存在。这是现在的标准 - 我不会告诉你密码错误,我会告诉你用户名或密码错误。我从不提供安全相关信息。

因此,然后将 403 隔离到允许您阅读但禁止更新(或删除)的更新操作。由于安全问题,不允许读取变成 404(未找到)。


推荐阅读