我正在寻找有关如何最好地处理 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。
- 这是做这件事的正确方法吗?错误处理文档表明中间件更好,但我不确定它是否指的是这个用例,因为我只能让它在 404 上工作。
- 如何在异常过滤器中获得正确的状态代码?
我知道,如果我在原始 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 并且只能访问已经存在的自定义异常扔。如果我可以访问状态码,那么我认为这两种解决方案都可以