当模型绑定器验证失败时,ASP.NET Core WebAPI 不会返回 ProblemDetails JSON

问题描述 投票:0回答:1

我正在对已升级到 .NET 8 的 ASP.NET Core WebAPI 应用程序进行更改。我们利用此处记录的

ProblemDetails
响应:

处理 ASP.NET Core 中的错误 - 问题详细信息

除了验证失败之外,这工作正常,当模型绑定器无法验证请求参数时,验证失败会发出

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 响应?

asp.net-core asp.net-core-webapi
1个回答
0
投票

查看您的代码片段,您似乎只注册了服务,而没有包含必要的中间件。要正确格式化错误,您需要使用

app.UseExceptionHandler()
方法添加中间件。

对于实现示例,我建议检查此存储库: https://github.com/irimescucosmin/ExceptionsHandler.NET

© www.soinside.com 2019 - 2024. All rights reserved.