我正在学习如何使用问题细节中间件找到这里
我的设置运行得很好,但我很好奇为什么它映射验证错误的方式不同于默认状态代码。
为了更好地解释,在所有者提供的回购示例中,请尝试以下操作:
调用https://localhost:54547/mvc/modelstate
响应"status":422
在项目的Program.cs中,注释掉MVC覆盖AddProblemDetailsConventions (第46行),然后再次调用
响应"status":400
400是在将ApiController属性添加到控制器时自动插入的验证错误的默认状态代码。
在前面与所有者这里的讨论中,建议调用AddProblemDetailsConventions
如果您希望从API中获得100%一致的错误响应(由中间件生成)。
我知道中间件是用来控制响应错误消息的“格式”以遵循RFC7870,但是为什么它要更改这个示例的错误代码呢?422比400更具体/更好吗?
我试图寻找更多的细节,但找不到任何细节。就像更改其他映射一样,或者如果有一种方法来配置中间件映射以获取默认验证错误(因为在我们的项目中,我们已经为验证场景在400上进行了测试断言)。
发布于 2022-09-23 21:22:33
在与您引用的作者的谈话中,他确实提到了一种在这个职位中覆盖默认状态响应代码的方法。
对于422状态代码,我的意见是语法正确,但语义无效的请求应该返回与400 Bad请求不同的状态代码
他还提到,并非每个人都可以选择遵循该约定,因此他提供了一种覆盖默认设置的方法:
有些人不喜欢它(通常是因为它是WebDAV RFC的一部分,而不是“正式的”HTTP (但这种情况很快就会改变,淘汰了RFC 7231的在HTTPbis即将到来的HTTP语义RFC中包含422 ),所以我添加了一个选项来更改它:
并提供指向ProblemDetailsOptions.ValidationProblemStatusCode源代码值的链接。
您可以向这样的配置传递options值,从而将默认状态代码更改为400状态代码:
services.AddProblemDetails(options =>
{
options.ValidationProblemStatusCode = 400;
});或者,如果您喜欢使用私有配置方法,比如在示例库中:
private void ConfigureProblemDetails(ProblemDetailsOptions options)
{
options.ValidationProblemStatusCode = 400;
// the rest of the code setup he used in the example
}至于其他已更改的映射,除了如果没有状态代码,则将状态代码设置为500。之外,我在默认情况下配置的源代码中看不到多少。
https://stackoverflow.com/questions/73775988
复制相似问题