在 ASP.NET Core 6 Web API 中的异常过滤器内生成问题详细信息

mor*_*ode 6 c# asp.net-core-webapi asp.net-core-6.0

该类ControllerBase有一个非常方便的Problem方法,可以自动生成RFC7807错误响应。我们只需指定标题和状态代码,Problem方法将填写其余部分(EG 类型 = URI 参考 [RFC3986])。

现在,我正在设计一个全局异常过滤器,它将根据遇到的异常返回错误响应。但我还想生成 RFC7807 格式的错误。该类型ProblemDetails本身无法生成值。我希望能够只提供标题和状态代码,而不关心其他值。我将无法使用ControllerBase.Problem,因为即使在创建控制器之前也可能会发生错误。

有没有办法ProblemDetails在异常过滤器内部自动生成对象?我正在使用 ASP.NET Core 6.0。

mor*_*ode 6

我想到了。

ControllerBase类有这样的:

_problemDetailsFactory = HttpContext?.RequestServices?.GetRequiredService<ProblemDetailsFactory>();
Run Code Online (Sandbox Code Playgroud)

似乎正在注入 ProblemDetailsFactory 的实现。所以在我的 ExceptionFilter 中,我只是这样做:

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Infrastructure;

public class ApiErrorsFilter : IExceptionFilter
{
    private ProblemDetailsFactory _problemDetailsFactory;

    public ApiErrorsFilter(ProblemDetailsFactory problemDetailsFactory) => _problemDetailsFactory = problemDetailsFactory;

    public void OnException(ExceptionContext context)
    {
        var exception = context.Exception;
        var httpContext = context.HttpContext;

        // sample response
        var problemDetails = _problemDetailsFactory.CreateProblemDetails(httpContext, statusCode: 500, title: "API error" );
        context.Result = new ObjectResult(problemDetails){
            StatusCode = problemDetails.Status
        };

        context.ExceptionHandled = true;
    }

}
Run Code Online (Sandbox Code Playgroud)

这对我来说已经足够好了,但是如果有更好的方法,请随时添加更多答案/评论。