我正在对已升级到 .NET 8 的 ASP.NET Core WebAPI 应用程序进行更改。我们利用此处记录的
ProblemDetails
响应:
除了验证失败之外,这工作正常,当模型绑定器无法验证请求参数时,验证失败会发出
400 Bad Request
响应。例如,以下端点采用 DateTime
参数作为查询字符串参数:
[ApiController]
[Route("[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
[Route("stacktest")]
public async Task<IActionResult> StackTest([FromQuery] DateTime? date)
{
Return Ok();
}
}
如果我请求此端点并提供无效日期,例如:
http://localhost:5000/MyController/stacktest?date=not-a-valid-date
正如预期的那样,模型绑定器自动失败验证并返回
400 Bad Request
响应,但它不发出预期的 ProblemDetails
响应 JSON,例如这就是我所期望的:
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"date": [
"The value 'not-a-valid-date' is not valid."
]
},
"traceId": "00-e2af23b124e37dcec4b2b5d72bca409d-705df282ff1dabe4-00"
}
我得到的是带有验证错误消息的原始字符串,即
The value 'not-a-valid-date' is not valid.
我确保在我的
Startup.cs
中启用了问题详细信息功能。正如我之前提到的,这是一个较旧的应用程序,随着时间的推移已升级到 .NET,并且仍然使用使用 Program.cs
和 Startup.cs
等初始化应用程序的旧样式:
public class Startup
{
private IConfiguration Configuration { get; }
public Startup(IWebHostEnvironment environment, IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddProblemDetails();
}
}
为了确认模型绑定器实际上应该发出
ProblemDetails
json 响应,我使用与上面相同的代码和配置创建了一个简单的 .NET8 ASP.NET Core Web API 项目,并且它确实发出了预期的 ProblemDetails
400 Bad Request
. 的 json 响应
所以问题是,为什么我的旧应用程序(但现在已升级到 .NET8)在模型绑定验证失败时不发出
ProblemDetails
json 响应?
查看您的代码片段,您似乎只注册了服务,而没有包含必要的中间件。要正确格式化错误,您需要使用
app.UseExceptionHandler()
方法添加中间件。
对于实现示例,我建议检查此存储库: https://github.com/irimescucosmin/ExceptionsHandler.NET