1

我正在寻找有关如何最好地处理 asp net core 中的异常的一些指导。基于来自微软的这些文档,我设置了 UseStatusCodePagesWithRedirects 中间件。这适用于诸如 404 之类的东西。但是,对于我的代码中返回异常的 API 请求,这不起作用。所以按照这个文档,我设置了一个异常过滤器。这有点工作,这就是我寻求帮助的地方。

我在类库中有以下代码,因此可以在其他地方重新使用。我的 api 的迷你包装器。我正在使用 Flurl 构建请求。我的 viewModelBuilder 调用 GetAll。

public async Task<List<TableDto>> GetAll(int branchId)
{

    var result = await _baseUrl.AppendPathSegment("/v1/Table/GetAll").WithOAuthBearerToken(await _authenticationManager.GetToken()).GetJsonAsync<List<TableDto>>();
    return result;
}

如果 GetAll 抛出异常,那么下面的异常过滤器就会发挥作用。

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {

        // ex.Call.Response.StatusCode // This works with the original exception but not here
        if (context.HttpContext.Response.StatusCode == (int)HttpStatusCode.Forbidden)
        {
            // Always 200
        }
    }
}

我想根据异常状态代码做不同的事情。因此,对于 401 或 404,我想显示访问被拒绝屏幕或登录屏幕,然后对于其他错误可能只是一般错误屏幕。但是 context.HttpContext.Response.StatusCode 始终为 200。

  1. 这是做这件事的正确方法吗?错误处理文档表明中间件更好,但我不确定它是否指的是这个用例,因为我只能让它在 404 上工作。
  2. 如何在异常过滤器中获得正确的状态代码?

我知道,如果我在原始 GetAll 周围进行尝试,如下所示

try
{
    var result = await _baseUrl.AppendPathSegment("/v1/Table/GetAll").WithOAuthBearerToken(await _authenticationManager.GetToken()).GetJsonAsync<List<TableDto>>();
    return result;

}
catch (FlurlHttpException ex)
{
    if (ex.Call.Response != null)
    {
        if (ex.Call.Response.StatusCode == HttpStatusCode.Forbidden)
        {
            throw new ForbiddenException();
        }
    }
}

然后在异常过滤器中我可以执行以下操作

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if (context.Exception is ForbiddenException)
        {

        }
    }
}

然后我可以针对特定异常做特定的事情,但这意味着我必须尝试捕获每个调用并使全局异常过滤器的点无效。任何意见,将不胜感激。

谢谢米

编辑

基于这里的这个答案,我可以编写一个自定义中间件,我很快就做到了,但我仍然遇到同样的问题,即无法检查 401 或 403 并且只能访问已经存在的自定义异常扔。如果我可以访问状态码,那么我认为这两种解决方案都可以

4

0 回答 0