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。
我想到了。
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)
这对我来说已经足够好了,但是如果有更好的方法,请随时添加更多答案/评论。